JS事件冒泡与事件捕获

简单理解:

事件冒泡:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div,即自下而上触发事件。

事件捕获: 跟上面的正好相反,自上而下触发事件,也就是从外到里。

示例:


<ul id="ul1">
    <li id="li1">111</li>
    <li>222</li>
    <li>333</li>
    <li>444</li>
</ul>

绑定事件:

document.getElementById("ul1").addEventListener("click",function(e){
                alert("ul事件被触发,"+this.id);
            })
            document.getElementById("li1").addEventListener("click",function(e){
                alert("li事件被触发,"+this.id)
            })

现在去点击111那行,执行结果是:


li事件被触发,li1
ul事件被触发,ul1

很明显是事件冒泡,自下而上,从里向外触发事件。

要注意:绑定事件方法有3个参数,第三个参数就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡。

改变参数,测试事件捕获:

document.getElementById("ul1").addEventListener("click",function(e){
                alert("ul事件被触发,"+this.id);
            },true)
document.getElementById("li1").addEventListener("click",function(e){
                alert("li事件被触发,"+this.id)
            },true)

现在去点击111那行:

ul事件被触发,ul1
li事件被触发,li1

执行结果显示,从外向里执行事件。

应用:

事件委托会用到事件冒泡的原理:也就是说只需要给ul绑定事件就可以了,点击li时由于冒泡机制会自己执行ul绑定的事件,从而避免li过多,逐条绑定事件造成的性能问题

猜你喜欢

转载自blog.csdn.net/wml00000/article/details/83582599