js事件冒泡

1、事件对象

     js的事件对象中保存了当前被触发事件的一些相关的属性信息,如事件源、事件发生时的鼠标位置、事件按键等。

     事件对象的获取方法:

     IE中可以window.event直接获取,而Firefox中则不可以,可通过如下方法获取:

           1)var event = window.event || arguments.callee.caller.arguments[0]; 

           2)通过参数传。function(e) { var event = window.event || e; }

2、事件源

     事件源即事件发生所在的元素(是最里层元素),在IE中用event.srcElement获取,在Firefox中用event.target获取。兼容性代码如下:

           var event = window.event || arguments.callee.caller.arguments[0];

           var targetObj = event.srcElement || event.target;

 

3、事件冒泡

      在默认情况下,发生在一个子元素上的单击事件(或者其他事件),如果在其父级元素绑定了一个同样的事件,此时点击子元素,click事件会首先被子元素捕获,执行绑定的事件程序,之后会被父级元素捕获,再次激发一段脚本的执行,这就是所谓的“事件冒泡”。

      但有的时候,在一个子元素上处理完单击事件后,不想触发其父元素的相同事件,则需要阻止冒泡的发生,阻止冒泡的方法如下:

      在IE里使用 window.event.cancelBubble = true;

      在Firefox里使用 event.stopPropagation();

      兼容性代码如下所示:

      var event = window.event || arguments.callee.caller.arguments[0];

      if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = true; }

 

4、jQuery对DOM的事件触发具有冒泡特性,jQuery.Event对象是符合W3C标准的一个事件对象,同时jQuery.Event免去了检查兼容IE的步骤。jQuery.Event提供了一个非常简单的方法来阻止事件冒泡:event.stopPropagation();示例代码如下:

      $("div").click(function(event) { event.stopPropagation(); });

      但是上面方法对使用live 绑定的事件没有作用,需要一个更简单的方法阻止事件冒泡:return false;示例代码如下:

      $("div").live(function() {

             //do something..

             return false;

      });

注意:event.stopPropagation()和return false两种阻止事件冒泡的方式有一些区别:return false 不仅阻止了事件往上冒泡,而且阻止了事件本身;event.stopPropagation() 则只阻止事件往上冒泡,不阻止事件本身,比如如下代码将导致单击文件浏览按钮,无法弹出文件浏览对话框。

<div id="panel">

     <input type="file" id="fileBtn"/>

</div>

<script type="text/JavaScript">

     $("#panel").click(function() {

           return false;     //return false在阻止冒泡的同时也会取消当前事件本身,这将阻止文件浏览对话框弹出

     });

</script>

 

5、阻止事件的默认行为(比如使文本输入框的键盘输入不起作用)

   上面说了阻止事件冒泡,但是事件的默认行为还是会发生,只不过事件不会再往上一级节点传递。阻止事件的默认行为的方式如下:

   1)原生JS的方式:

        

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //如果提供了事件对象,则这是一个非IE浏览器   
  2.     if (event && event.preventDefault) {   
  3.         //阻止默认浏览器动作(W3C)   
  4.         event.preventDefault();   
  5.     } else {  
  6.         //IE中阻止函数器默认动作的方式   
  7.         window.event.returnValue = false;   
  8.     }  
  9.     return false;  

 

    2)jQuery的方式

       在上面的第4点中已经说过了,直接返回false就行

 

 

<html> 
<head> 
<title> 阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)</title> 
<meta name="keywords" content="JavaScript,事件冒泡,cancelBubble,stopPropagation" /> 
<script type="text/javascript"> 
function doSomething (obj,evt) { 
	alert(obj.id); 
var e=(evt)?evt:window.event; //判断浏览器的类型,在基于ie内核的浏览器中的使用cancelBubble
if (window.event) { 
	e.cancelBubble=true; 
} else { 
//e.preventDefault(); //在基于firefox内核的浏览器中支持做法stopPropagation
	e.stopPropagation(); 
} 
} 
</script> 
</head> 
<body> 
<div id="parent1" οnclick="alert(this.id)" style="width:250px;background-color:yellow"> 
	<p>This is parent1 div.</p> 
	<div id="child1" οnclick="alert(this.id)" style="width:200px;background-color:orange"> 
	<p>This is child1.</p> 
</div> 
<p>This is parent1 div.</p> 
</div> 
<br /> 
<div id="parent2" οnclick="alert(this.id)" style="width:250px;background-color:cyan;"> 
	<p>This is parent2 div.</p> 
	<div id="child2" οnclick="doSomething(this,event);" style="width:200px;background-color:lightblue;"> 
		<p>This is child2. Will bubble.</p> 
	</div> 
	<p>This is parent2 div.</p> 
</div> 
</body> 
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值