触发顺序为 先捕获后冒泡

事件处理模型 冒泡 捕获.png

冒泡

事件冒泡 :结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,子元素冒泡向父元素 (自底向上)

  1. <div class="zu" style="background: red; width: 100px; height: 100px;">
  2. <div class="fu" style="background: yellow; width: 50px; height: 50px;">
  3. <div class="zi" style="background: blue; width: 25px; height: 25px;">
  4. </div>
  5. </div>
  6. </div>
  7. <script>
  8. // 触发冒泡,
  9. var zu = document.getElementsByClassName('zu')[0];
  10. var fu = document.getElementsByClassName('fu')[0];
  11. var zi = document.getElementsByClassName('zi')[0];
  12. zu.addEventListener('click',function(){
  13. console.log("zu");
  14. },false);
  15. fu.addEventListener('click',function(){
  16. console.log("fu");
  17. },false);
  18. zi.addEventListener('click',function(){
  19. console.log("zi");
  20. },false);
  21. </script

捕获

事件捕获 :结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,父元素捕获至子元素 (自顶向下)
ie没有捕获事件

  1. <script>
  2. var zu = document.getElementsByClassName('zu')[0];
  3. var fu = document.getElementsByClassName('fu')[0];
  4. var zi = document.getElementsByClassName('zi')[0];
  5. zu.addEventListener('click',function(){
  6. console.log("zu");
  7. },true);
  8. fu.addEventListener('click',function(){
  9. console.log("fu");
  10. },true);
  11. zi.addEventListener('click',function(){
  12. console.log("zi");
  13. },true);
  14. </script>

当事件捕获与事件冒泡都存在时,先捕获后冒泡。如果是捕获绑定在前冒泡在后,顺序就是先捕获再冒泡,但是如果先绑定冒泡在绑定 捕获的话,会在触发事件的元素哪里出现元素的事件执行在元素的的事件执行,但这的事件执行时,谁先绑定,谁先执行,因为是先绑定的冒泡,所以执行顺序为 zu捕获 fu捕获 zi事件执行/此处执行zi冒泡 zi事件执行 fu冒泡 zu 冒泡 事件执行谁先绑定先执行谁

冒泡的取消

  1. zi.addEventListener('click',function(e){
  2. // 事件对象: 可以在每一个事件处理函数中写一个形参,系统会传入事件对象,事件对象会记录这个事件发生时的一系列数据,系统会把它打包成一个对象传到形参里
  3. e.stopPropagation(); //取消冒泡 stopPropagation 是事件对象上的一个方法
  4. e.cancelBubble =true; //兼容ie 谷歌上也有
  5. console.log("zi");
  6. },false);

事件委托

利用事件冒泡,和事件源对象进行处理

  1. <ul>
  2. <li>1</li>
  3. <li>2</li>
  4. <li>3</li>
  5. <li>4</li>
  6. <li>5</li>
  7. <li>6</li>
  8. <li>7</li>
  9. <li>8</li>
  10. <li>9</li>
  11. <li>10</li>
  12. </ul>
  13. <script>
  14. // 使用事件委托,将li的文本打印在控制台
  15. var ul = document.getElementsByTagName("ul")[0];
  16. ul.onclick = function (e) {
  17. var event = e || window.event;
  18. var target = event.target || event.srcElement;
  19. console.log(target.innerText);
  20. }
  21. </script>

事件委托.png