Javascript事件流(事件捕获、事件冒泡),事件委托(代理)

Javascript事件流(事件捕获、事件冒泡)–>事件委托(代理)

Javascript与HTML之间的交互是通过“事件”实现的。事件,就是文档或浏览器窗口发生的一些特定的交互瞬间,当我们与浏览器中的web页面进行特定的交互时,事件就发生了。
事件从触发到完成响应一般分为三个阶段:捕获阶段,目标阶段、冒泡阶段。

事件流

页面中接受事件的顺序,也就是事件响应的顺序。大部分浏览器默认都是用IE的“事件冒泡”顺序(从里层向外层);而网景采用“事件捕获”顺序(从外层向里层)。使用冒泡流可以兼容更多的浏览器(IE6,7,8均只支持冒泡流)。事件流原理图如下:
Javascript事件流(事件捕获、事件冒泡),事件委托(代理)_第1张图片
看图:
1、(1-5)为捕获流(外向里),(5-6)为目标过程,(6-10)为冒泡流(里向外)
2、一个完整的JS事件流是从window开始,最后回到window的一个过程

事件冒泡

事件冒泡就是从当前触发的事件目标一层一层往外传递,依次触发(上一层有绑定此事件就触发,没有就往外一层继续),直到document为止(上图的6-10)

事件捕获

事件捕获就是从document开始触发,一层一层往里传递,依次触发,直到事件目标节点为止(上图的1-5)

事件委托(事件代理)

给你当前想要操作的节点的父节点绑定你想要的操作事件。开始触发时,子节点不会响应事件,冒泡到父节点,由父节点响应事件。
当你同一父节点下有很多子节点且都需要绑定事件,可以委托绑定给父节点,让父节点监听。

优点:
1.可以大量节省内存占用,减少事件注册(绑定)。
2.当新增子节点时,可以不用给它重新绑定。事件是绑定在父节点的,和目标节点的增减是没有关系的。

例子

ul中有许多个li,想要每个li都有click事件响应:

<ul>
	<li>520li>
	<li>520li>
	<li>520li>
	<li>520li>
	<li>520li>
	...
ul>
	var ul = ducoment.querySelector('ul');
	ul.addEventListener('click', function() {
		alert('你点击了“520”!');
	});

这样就不需要给每一个li绑定click事件,这只是一个简单的例子

阻止事件传播

在支持addEventListener()的浏览器中,可以调用事件对象的stopPropagation()方法以阻止事件的继续传播。当同一对象中还绑定了其他处理事件,剩下的处理事件依旧可被调用。但是哪个对象调用stopPropagation()方法后,那么此对象以外的其他任何对象都无法传播到。

<body>
    <div>
        <ul>
            <li>520li>
            <li>520li>
            <li>520li>
            <li>520li>
            <li>520li>
        ul>
    div>
body>

以上HTML代码嵌套进了body和div元素中- - -

<script>
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function() {
            alert('你点击了“520”!');
        })
        var div = document.querySelector('div');
        div.addEventListener('click', function(e) {
            alert('你点击了“520”!');
            e.stopPropagation();
        })
        var body = document.querySelector('body');
        body.addEventListener('click', function() {
            alert('你点击了“520”!');
        })
        </script>
</body>

代码执行结果:
当点击li , 页面只弹出了两次alert;
当我把e.stopPropagation() 去掉,页面会弹出三系alert;
当我把e.stopPropagation() 放到ul 中,结果只弹出一次alert;

最后注意:
1.一般都使用事件冒泡原理来做事件委托,这样可以先执行目标节点的事件;
2.使用“事件委托”时,并不是说把事件委托给的元素越靠近顶层就越好。事件冒泡的过程也需要耗时,越靠近顶层,事件的”事件传播链”越长,也就越耗时。如果DOM嵌套结构很深,事件冒泡通过大量祖先元素会导致性能损失。

参考文章:
link
link

你可能感兴趣的:(Javascript事件流(事件捕获、事件冒泡),事件委托(代理))