`
yxc_gdut
  • 浏览: 97990 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

奇怪的DOM事件触发顺序

阅读更多

  撇开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, 两个事件会按照定义顺序执行。

 

  • 大小: 35.6 KB
  • 大小: 17.5 KB
分享到:
评论

相关推荐

    前端大厂最新面试题-summary.docx

    * 在 setTimeout 或者原生 DOM 事件中,setState 是同步的 6. React 的事件机制? * React 基于浏览器的事件机制自身实现了一套事件机制,包括事件注册、事件的合成、事件冒泡、事件派发等 * 组件注册的事件最终会...

    js常见经典面试题汇总

    默认情况下,事件触发顺序遵循**事件冒泡**原则。首先触发子div的事件处理器,然后是父div的事件处理器。 #### 19. 阻止冒泡的方式及作用 - **event.stopPropagation()**:阻止当前事件继续在DOM树中传播,防止...

    大名鼎鼎SWFUpload- Flash+JS 上传

    当Flash上传文件的时候,由开发人员预定义的Javascript事件会被定时触发以便来更新页面中的UI,同时还提供上传状态和错误信息。 选定的文件的上传和它所在页面、表单是独立的。每个文件都是单独上传的,这就保证了...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    java 面试题 总结

    以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1(); Inc inc=tt.new Inc(); ...

Global site tag (gtag.js) - Google Analytics