JavaScript冒泡顺序是指,当一个事件被触发后,该事件会从触发它的元素开始,逐级向上冒泡直到document对象(页面)被触发。在这个过程中,如果任何一个元素捕获到这个事件,那么事件便不会继续向上冒泡。
举个例子,如果有这样一个HTML结构:
<div id="outer"> <div id="middle"> <div id="inner"> </div> </div> </div>
并且给这三个div分别绑定了一个点击事件:
• var outer = document.querySelector('#outer'); outer.addEventListener('click',function(){ console.log('outer'); }); • var middle = document.querySelector('#middle'); middle.addEventListener('click',function(){ console.log('middle'); }); • var inner = document.querySelector('#inner'); middle.addEventListener('click',function(){ console.log('inner'); });
当我们点击最里层的inner元素时,按照冒泡顺序,依次输出的结果应该是:"inner" ->"middle" ->"outer"。
需要注意的是,由于JavaScript冒泡顺序是从子元素开始冒泡到父元素,如果在子元素上绑定了一个事件,同时父元素上也绑定了同一个事件,那么在父元素冒泡到该事件时,该事件依然会被触发。
例如:
• var outer = document.querySelector('#outer'); outer.addEventListener('click',function(){ console.log('outer'); }); • var middle = document.querySelector('#middle'); middle.addEventListener('click',function(){ console.log('middle'); }); • var inner = document.querySelector('#inner'); middle.addEventListener('click',function(){ console.log('inner'); }); • inner.addEventListener('click',function(){ console.log('inner clicked again'); });
当我们再次点击最里层的inner元素时,输出的结果将是:"inner" ->"inner clicked again" ->"middle" ->"outer"。
总结一下,JavaScript冒泡顺序是从子元素开始向父级元素逐层冒泡的。如果一个元素上绑定了同一个事件的多个回调函数,那么它们的执行顺序是按照它们被绑定的顺序执行的。如果一个元素上的事件被捕获,那么它就不会接着向上冒泡了。