Js事件机制执行的顺序

1、事件经历三个阶段:

事件捕获、事件触发、事件冒泡

2、触发事件方法如:

element.addEventListener(eventName, handler, useCapture);

eventName: 事件名称

handler:回调函数

useCapture:执行时机   true:在捕获阶段执行, false:在冒泡阶段执行,false为默认值

3、具体含义:

事件捕获:由外到内

事件触发:那个元素真正触发了事件

事件冒泡:由内到外

如果 ul 和 li 都绑定了click事件,当对  li   元素进行点击事件时,事件捕获则是先调用ul的click事件,之后再调用li的click事件,冒泡阶段则是先调用li的click事件,之后再调用ul的click事件

4、阻止冒泡

event.stopPropagation();阻止事件冒泡
IE浏览器:window.event.cancelBubble = true

5、阻止捕获

 

6、具体案例:

案例一:

 <ul id="app">
    <li id="child">大家好,我是1号</li>
    <li>大家好,我是2号</li>
    <li>大家好,我是3号</li>
    <li>大家好,我是4号</li>
    <li>大家好,我是5号</li>
  </ul>
  <script>
    var app = document.getElementById('app');
    app.addEventListener('click', function (event) {
      console.log(1, event.target, event);
    });
    var li = document.getElementById('child');
    li.addEventListener('click', function (event) {
      console.log(2, event.target, event);
    });

  </script>

结果是:

2 <li id=​"child">​…​</li>​ PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …}
1 <li id=​"child">​…​</li>​ PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …}

执行的顺序是冒泡顺序
如果将li的click事件的第三个参数设置为true,得到的结果也是如上结果,因为对于ul来说触发阶段在冒泡阶段,则是先执行li的点击事件,而li的触发阶段是在捕获阶段,因此先执行li的点击事件

案例二:

<ul id="app">
    <li id="child">大家好,我是1号</li>
    <li>大家好,我是2号</li>
    <li>大家好,我是3号</li>
    <li>大家好,我是4号</li>
    <li>大家好,我是5号</li>
  </ul>
  <script>
    var app = document.getElementById('app');
    app.addEventListener('click', function (event) {
      console.log(1, event.target, event);
    }, true);
    var li = document.getElementById('child');
    li.addEventListener('click', function (event) {
      console.log(2, event.target, event);
    }, true);

  </script>

结果是:

1 <li id=​"child">​…​</li>​ PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …}
2 <li id=​"child">​…​</li>​ PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …}

执行的顺序是捕获顺序
如果将ul的click事件的第三个参数设置为true,li的第三个参数为false, 得到的结果也是如上结果,因为对于ul来说触发阶段在捕获阶段,则是先执行ul的点击事件,而ul的触发阶段是在捕获阶段,因此先执行ul的点击事件

 

案例三:

 

posted @ 2021-10-11 11:20  火烈鸟的梦  阅读(1373)  评论(0编辑  收藏  举报