美文网首页
事件冒泡和事件捕获

事件冒泡和事件捕获

作者: codeffee | 来源:发表于2017-03-18 17:15 被阅读0次

    事件流

    从页面中接受事件的顺序。

    DOM2级流包含三个阶段

    1. 事件捕获
    2. 处于事件目标
    3. 事件冒泡

    1,事件冒泡:

    即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。

    冒泡是向上的

    比如点击div1

    <!DOCTYPE html>
    <html>
    <head>
        <title>Event Bubbling Example</title>
    </head>
    <body>
        <div id="div1">Click Me</div>
    </body>
    </html>
    

    如果你点击了页面中的<div>元素,那么这个 click 事件会按照如下顺序传播:

    1. <div>
    2. <body>
    3. <html>
    4. document

    也就是说,click 事件首先在 <div> 元素上发生,而这个元素就是我们单击的元素。然后,click 事件沿 DOM 树向上传播,在每一级节点上都会发生,直至传播到 document 对象。下图展示了事件冒泡的过程。

    imageimage

    2,事件捕获:

    与事件冒泡正好相反

    从最不具体的节点到最具体的元素依次触发某个事件。

    DOM1级事件处理程序

    比如

    btn.onclick=function(){
        alert(1);
    }
    
    btn.onclick=function(){
        alert(2);
    }
    
    //只会alert(2),这是DOM 1级  后面的会覆盖前面的
    
    

    删除DOM1级的事件处理程序。需要用到null

    btn.onclick=null
    

    将事件处理程序设置为 null 之后,再单击按钮将不会有任何动作发生。

    DOM2级事件模型

    处理指定和删除事件处理程序的操作:
    addEventListener()removeEventListener()

    都接受三个参数

    要处理的事件名、作为事件处理程序的函数和一个布尔值。最后这个布尔值参数如果是 true,表示在捕获阶段调用事件处理程序;如果是 false,表示在冒泡阶段调用事件处理程序。

    var btn = document.getElementById("myBtn");
    btn.addEventListener("click", function(){
        console.log(this.id);
    }, false);
    

    通过DOM2,可以给某个元素添加多个相同的事件。

    var btn = document.getElementById("myBtn");
    btn.addEventListener("click", function(){
        console.log(this.id);
    }, false);
    btn.addEventListener("click", function(){
        console.log("Hello world!");
    }, false);
    

    会依次触发,打印是id和Hello world

    好处:为同一个元素添加多个事件处理程序。

    移出事件removeEventListener()

    注意:通过 addEventListener() 添加的匿名函数将无法移除,如下面的例子所示。

    var btn = document.getElementById("myBtn");
    btn.addEventListener("click", function(){
        console.log(this.id);
    }, false);
    btn.removeEventListener("click", function(){ // 没有用!
        console.log(this.id);
    }, false);
    

    看似会删除掉事件,但是第二个参数是不一样的。fn!=fn

    那如何才能移出事件呢?

    方法:将第二个参数改写为有名函数

    var btn = document.getElementById("myBtn");
    var fn1 = function(){
        console.log(this.id);
    };
    btn.addEventListener("click",fn1, false);
    btn.removeEventListener("click", fn1, false); // 有效!
    

    这样三个参数就是一致的了,可以有效移出事件

    相关文章

      网友评论

          本文标题:事件冒泡和事件捕获

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