撇开IE的时间处理机制,DOM level2 的事件触发机制是先捕获再上浮。
之前测试过,原来浏览器执行DOM事件并非严格按照先捕获再上浮的顺序,
看看下面代码:
<!DOCTYPE HTML> <html> <head> <title>事件触发顺序</title> <meta http-equiv="content-type" content="text/html; charset=GB2312"> <style type="text/css"> #outer{width:200px;border:3px solid red;color:#f00;padding:0.5em;} #inner{border:3px solid green;color:#00f;padding:0.5em;} </style> </head> <body> <div id='outer'> this is outer div <div id='inner'> this is inner div </div> </div> <script type='text/javascript'> window.onload=function(){ var body = document.body; var outer_el = document.getElementById('outer'); var inner_el = document.getElementById('inner'); body.addEventListener('click',func1,true); outer_el.addEventListener('click',func2,true); inner_el.addEventListener('click',func3,true); inner_el.addEventListener('click',func4,false); outer_el.addEventListener('click',func5,false); body.addEventListener('click',func6,false); } function func1(){ console.log('事件1'); } function func2(){ console.log('事件2'); } function func3(){ console.log('事件3'); } function func4(){ console.log('事件4'); } function func5(){ console.log('事件5'); } function func6(){ console.log('事件6'); } </script> </body> </html>
上面代码点击inner元素,执行结果正常
稍微将事件定义的顺序调整下
body.addEventListener('click',func1,true); outer_el.addEventListener('click',func2,true); inner_el.addEventListener('click',func4,false); inner_el.addEventListener('click',func3,true); outer_el.addEventListener('click',func5,false); body.addEventListener('click',func6,false);
再次点击inner元素
inner元素里面的两个事件执行顺序就没有遵循先捕获后上浮的顺序,而是看哪个先定义。
我把outer的两个事件调换定义顺序,点击inner的时候,outer的两个时间定义顺序正常,假如点击outer, 两个事件会按照定义顺序执行。
相关推荐
* 在 setTimeout 或者原生 DOM 事件中,setState 是同步的 6. React 的事件机制? * React 基于浏览器的事件机制自身实现了一套事件机制,包括事件注册、事件的合成、事件冒泡、事件派发等 * 组件注册的事件最终会...
默认情况下,事件触发顺序遵循**事件冒泡**原则。首先触发子div的事件处理器,然后是父div的事件处理器。 #### 19. 阻止冒泡的方式及作用 - **event.stopPropagation()**:阻止当前事件继续在DOM树中传播,防止...
当Flash上传文件的时候,由开发人员预定义的Javascript事件会被定时触发以便来更新页面中的UI,同时还提供上传状态和错误信息。 选定的文件的上传和它所在页面、表单是独立的。每个文件都是单独上传的,这就保证了...
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1(); Inc inc=tt.new Inc(); ...