浏览器事件流机制

2020-06-22  本文已影响0人  练习时长2年半的个人练习生
事件捕获/事件冒泡

他们的本质是事件流的两个方向.

注意:他们传递的是事件.而不是事件绑定的函数

应用场景:可以用他们实现事件委托.

事件冒泡示例:

通过事件冒泡的原理, li被点击后.事件 传递到ul上,ul触发onclik绑定的方法. target 表示的是点击的目标对象. 让后,改变target对象实现事件委托.
好处就是:减少了重复绑定.减少了遍历带来的性能损耗.

<body>
 <ul id="div1">

     <li >111111111111111111</li>
     <li >222222222222222222</li>
     <li >333333333333333333</li>
     <li >444444444444444444</li>
     <li >555555555555555555</li>
 </ul>
</body>
//html代码
<script>
 var div1 = document.getElementById("div1");
 var li = document.getElementsByTagName('li')

  div1.onclick = function (event) { 
     console.log('father')
     if(event.target.nodeName=='LI')  {
         event.target.style.color = 'red'
     }
  };
 
  Array.prototype.forEach.call(li,(item)=>{
    //  item.onclick = e => e.stopPropagation()
  })

addEventListener 的第三个参数控制 浏览器在捕获阶段执行,还是冒泡阶段执行.. true为捕获 false为冒泡.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>事件捕获</title>
    <style type="text/css">
        #ul {
            width: 300px;
            height: 300px;
            border: hotpink 3px solid;
        }
    </style>
</head>

<body>
    <div id="outer" style="width: 300px;height: 300px;background:black;">

        <div id="middle"  style="width: 200px;height: 200px;background:blue;">

            <div id="inner"  style="width: 100px;height: 100px;background:red;"></div>
        </div>
    </div>
</body>
<script>
    var outer = document.getElementById("outer");
    var middle = document.getElementById('middle')
    var inner = document.getElementById('inner')
  

    outer.addEventListener('click', function () {
        console.log('爷爷')
    }, true)
    middle.addEventListener('click', function () {
        console.log('父亲')
    }, true)
    inner.addEventListener('click', function () {
        console.log('孩子')
    }, true)

    //点击孙子  执行结果. 爷爷/父亲/孩子
</script>

</html>

补充:

e.stopPropagation();可以组织事件冒泡
e.preventDefault() 可以阻止浏览器默认行为.比如,让a标签取消默认的跳转功能.

event.currentTarget 事件响应节点对象.
event.target 事件触发节点对象.

上一篇 下一篇

猜你喜欢

热点阅读