触发顺序为 先捕获后冒泡
冒泡
事件冒泡 :结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,子元素冒泡向父元素 (自底向上)
<div class="zu" style="background: red; width: 100px; height: 100px;"><div class="fu" style="background: yellow; width: 50px; height: 50px;"><div class="zi" style="background: blue; width: 25px; height: 25px;"></div></div></div><script>// 触发冒泡,var zu = document.getElementsByClassName('zu')[0];var fu = document.getElementsByClassName('fu')[0];var zi = document.getElementsByClassName('zi')[0];zu.addEventListener('click',function(){console.log("zu");},false);fu.addEventListener('click',function(){console.log("fu");},false);zi.addEventListener('click',function(){console.log("zi");},false);</script
捕获
事件捕获 :结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,父元素捕获至子元素 (自顶向下)
ie没有捕获事件
<script>var zu = document.getElementsByClassName('zu')[0];var fu = document.getElementsByClassName('fu')[0];var zi = document.getElementsByClassName('zi')[0];zu.addEventListener('click',function(){console.log("zu");},true);fu.addEventListener('click',function(){console.log("fu");},true);zi.addEventListener('click',function(){console.log("zi");},true);</script>
当事件捕获与事件冒泡都存在时,先捕获后冒泡。如果是捕获绑定在前冒泡在后,顺序就是先捕获再冒泡,但是如果先绑定冒泡在绑定 捕获的话,会在触发事件的元素哪里出现元素的事件执行在元素的的事件执行,但这的事件执行时,谁先绑定,谁先执行,因为是先绑定的冒泡,所以执行顺序为 zu捕获 fu捕获 zi事件执行/此处执行zi冒泡 zi事件执行 fu冒泡 zu 冒泡 事件执行谁先绑定先执行谁
冒泡的取消
zi.addEventListener('click',function(e){// 事件对象: 可以在每一个事件处理函数中写一个形参,系统会传入事件对象,事件对象会记录这个事件发生时的一系列数据,系统会把它打包成一个对象传到形参里e.stopPropagation(); //取消冒泡 stopPropagation 是事件对象上的一个方法e.cancelBubble =true; //兼容ie 谷歌上也有console.log("zi");},false);
事件委托
利用事件冒泡,和事件源对象进行处理
<ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><script>// 使用事件委托,将li的文本打印在控制台var ul = document.getElementsByTagName("ul")[0];ul.onclick = function (e) {var event = e || window.event;var target = event.target || event.srcElement;console.log(target.innerText);}</script>

