1. 程式人生 > 其它 >Js事件機制執行的順序

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的點選事件

案例三: