美文网首页
javascript-事件流

javascript-事件流

作者: ssttIsme | 来源:发表于2020-01-12 19:51 被阅读0次

javascript-事件流

当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序(如由下往上)响应改元素
的触发事件,事件传播(发生)的顺序叫做事件流。
事件流是一直存在的,并不是因为添加了事件才存在。

一、事件流的分类

1.1冒泡型事件(所有浏览器都支持)

由明确的事件源到最不确定的事件源依次向上触发
addEventListener(事件,处理函数,false)

<!DOCTYPE html>
<html lang="en" onclick="show('html')">
<head>
    <meta charset="UTF-8">
    <title>javascript事件流</title>
    <style>
        li{
            border: 1px solid #0f0;
        }
        ul{
            border: 1px solid #f0f;
        }
        div{
            border: 1px solid #000;
        }
        body{
            padding: 5px;
            border: 1px solid #f00;
        }
        html{
            border: 1px solid #00f;
        }
    </style>
</head>
<body onclick="show('body')">
<div onclick="show('div')">
    <ul onclick="show('ul')">
        <li onclick="show('li')">第1个</li>
        <li onclick="show('li')">第2个</li>
        <li onclick="show('li')">第3个</li>
    </ul>
</div>
<script>
    function show(text) {
        alert(text);
    }
    document.onclick=function () {
        show('document');
    }
</script>
</body>
</html>

点击如何一个li,依次弹出li,ul,div,body,html,document


1.2捕获型事件(IE不支持,WC3C标准的浏览器如火狐支持)

不确定的事件源到明确的事件源依次向下触发
addEventListener(事件,处理函数,true)

<div id="outer" style="border: 1px solid #f00; width: 200px; height: 200px; padding: 10px;">
    <div id="inner" style="border: 1px solid #00f; width: 100px; height: 100px; padding: 10px; "></div>
</div>
<script>
    var outer=document.getElementById("outer");
    var inner=document.getElementById("inner");
    outer.addEventListener("click",function () {
        alert(this.id);
    },true);
    inner.addEventListener("click",function () {
        alert(this.id);
    },true);
</script>

点击蓝色方框,先弹出outer,再弹出inner

二、阻止事件流

事件对象.cancelBubble=true(IE)
事件对象.stopPropagation()(火狐)

<!DOCTYPE html>
<html lang="en" onclick="show(event,'html')">
<head>
    <meta charset="UTF-8">
    <title>javascript事件流</title>
    <style>
        li{
            border: 1px solid #0f0;
        }
        ul{
            border: 1px solid #f0f;
        }
        div{
            border: 1px solid #000;
        }
        body{
            padding: 5px;
            border: 1px solid #f00;
        }
        html{
            border: 1px solid #00f;
        }
    </style>
</head>
<body onclick="show(event,'body')">
<div onclick="show(event,'div')">
    <ul onclick="show(event,'ul')">
        <li onclick="show(event,'li')">第1个</li>
        <li onclick="show(event,'li')">第2个</li>
        <li onclick="show(event,'li')">第3个</li>
    </ul>
</div>
<script>
    function show(event,text) {
        alert(text);
        if(event.stopPropagation){
            event.stopPropagation();
        }else{
            event.cancelBubble=true;
        }
    }
    document.onclick=function () {
        show('document');
    }
</script>
</body>
</html>

三、目标事件源的对象

事件对象.srcElement(IE)
事件对象.target(火狐)

<div>
    <ul onclick="show(event)">
        <li >第1个</li>
        <li >第2个</li>
        <li >第3个</li>
    </ul>
</div>
<script>
    function show(event) {
        var object=event.srcElement||event.target;
        alert(object.innerHTML);
    }
</script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生成绩单</title>
    <style>
        table{
            margin: 0 auto;
        }
    </style>
</head>
<body>
<table border="1px" width="600px" cellpadding="0" cellspacing="0px" id="scoreList">
    <caption>学生成绩单</caption>
    <tr><th>姓名</th><th>班级</th><th>科目</th><th>成绩</th></tr>
    <tr>
        <td>张三</td>
        <td>1班</td>
        <td>语文</td>
        <td>98</td>
    </tr>
    <tr>
        <td>李四</td>
        <td>2班</td>
        <td>语文</td>
        <td>97</td>
    </tr>
    <tr>
        <td>王五</td>
        <td>3班</td>
        <td>语文</td>
        <td>99</td>
    </tr>
</table>
<script>
    var table=document.getElementById("scoreList");
    table.onclick=function(e){
        var ev=e||window.event;
        var td=ev.srcElement||ev.target;
        if(td.nodeName=="TH"||td.nodeName=="CAPTION"){
            return;
        }
        var tdText=td.innerHTML;
        td.innerHTML="";
        var inputs=document.createElement("input");
        inputs.type="text";
        inputs.size=10;
        td.appendChild(inputs);
        inputs.focus();

        inputs.onblur=inputs.ondblclick=inputs.onkeydown=function(e){
            var ev=e||window.event;
            if(ev.type=="blur"||ev.type=="dbclick"||(ev.type=="keydown"&&ev.keyCode==13)){
                 var val=this.value;
                 td.removeChild(inputs);
                 if(val==""){
                     td.innerHTML=tdText;
                 }else{
                     td.innerHTML=val;
                }
            }
        }

    }
</script>
</body>
</html>

相关文章

  • javascript-事件流

    javascript-事件流 当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序(如由下往上)响应...

  • javascript-事件基础和事件绑定

    javascript-事件基础和事件绑定 一、事件驱动 1.1事件 javascript侦测到的用户的操作(点击、...

  • javascript-事件对象

    javascript-事件对象 一、事件对象 用来记录一些事件发生时的相关信息的对象 1.只有当事件发生的时候才能...

  • Javascript-事件

    一、事件流 定义:事件流描述的是从页面中接收事件的顺序。但有意思的是,IE 和Netscape 开发团队居然提出了...

  • JS基础知识掌握

    JavaScript-输出内容(document.write)可用于直接向 HTML 输出流写内容。简单的说就是直...

  • 11、JavaScript-事件

    每天一句:一个人现在某一个领域达到极致,往往需要一万小时的积累。现在的你就是需要努力先让自己成为一个领域的高手,然...

  • 12、JavaScript-事件

    每天一句 : 让思考成为一种习惯。 一、事件捕获 事件绑定方式一(同一事件会被覆盖) 事件绑定方式二(同一事件可以...

  • JavaScript-鼠标事件

    鼠标事件比较多,比如常见的比如鼠标点击、移入、移出事件等 onclick 鼠标点击事件 通过上面的代码,我们放到网...

  • JavaScript-事件循环

    参考JavaScript运行机制之事件循环(Event Loop)详解 从setTimeout说事件循环模型 单...

  • javaScript-事件委托

    前面写过on和addEventListener的区别,用法我就不在这里面讲了,主要看一下什么是事件委托。 事件委托...

网友评论

      本文标题:javascript-事件流

      本文链接:https://www.haomeiwen.com/subject/irdwactx.html