admin
管理员
管理员
  • UID1
  • 粉丝2
  • 关注2
  • 发帖数339
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:2983回复:0

jquery的冒泡事件event.stopPropagation()

楼主#
更多 发布于:2013-07-24 16:10
分享到:
js中的冒泡事件与事件监听冒泡事件
js中“冒泡事件”并不是能实际使用的花哨技巧,它是一种对js事件执行顺序的机制,“冒泡算法”在编程里是一个经典问题,冒泡算法里面的冒泡应该
说是交换更加准确;js里面的“冒泡事件”才是真正意义上的“冒泡”,它从DOM最低层逐层遍历树,然后附加相应事件。以下面代码为例:

<title>冒泡事件</title>
 <script type="text/javascript">
 function Add(sText)
 {
    
document.getElementByIdx_x_x("Console").innerHTML +=sText;
 }
 </script>
 </head>
<body onclick="Add(’body事件触发<br
/>’)">
 <div onclick="Add(’div事件触发<br
/>’)">
    
<p onclick="Add(’p事件触发<br
/>’)"
style="background:#c00;">点击</p>
 </div>
 <div id="Console" style="border:solid 1px #ee0;
background:#ffc;"></div>
 </body>
先执行p的事件,再执行div的事件,最后执行body事件.
事件监听
事件监听准确一点讲可以说是js引擎对用户鼠标、键盘、窗口事件等动作的监视进行的操作,也就是针对用户相应的操作进行附加事件,常用的类似
btnAdd.onclick="alert(’51obj.cn’)"就是一种简单的附加事件,只不过这种方法不支持附加多个事件以及删除事件。以下代
码将实现附加事件后删除事件(IE下):

<script
type="text/javascript">
 <!–
 var oP;
 function window.onload(){
    
oP=document.getElementByIdx_x_x("pContent");
    
oP.attachEvent("onclick",Click);
 }
 function Click(){
    
alert("做点什么吧");
    
oP.detachEvent("onclick",Click);
 }
 //–>
 </script>
 </head>
<body>
 <p id="pContent" style="border:solid 1px #d00;
background:#cff;">点击</p>
IE不能称为标准的DOM浏览器,即使是最新的IE8,相对于标准DOM如Firefox、Opera等,它是个“异类”;在Firefox中才真正有称为事件监听的函数addEventListener,如下例
<script
type="text/javascript">
 <!–
 window.onload=function(){
     var
oBtn=document.getElementByIdx_x_x("btn");
    
oBtn.addEventListener("click",Click,false);
 }
 function Click(){
    
alert("触发click事件");
 }
 //–>
 </script>
 <button
id="btn">点击</button>


从上面两个例子看出attachEvent在Firefox中并不支持,IE也不支持addEventListener.因此需要使用兼容性的方法。
<script type="text/javascript">
 <!–
 var oBtn;
 window.onload=function(){
    
oBtn=document.getElementByIdx_x_x("btn");
    
if(window.addEventListener){
    
  
oBtn.addEventListener("click",Click,false);
    
}//FF,Opera…
     else
if(window.attachEvent){
    
  
oBtn.attachEvent("onclick",Click,false);
     }//IE
     else{
    
  
oBtn.onclick=Click;
    
}//Other
 }

function Click(){
    
alert("事件只执行一次");
    
if(window.addEventListener){
    
  
oBtn.removeEventListener("click",Click,false);
     }//FF
     else
if(window.attachEvent){
    
  
oBtn.detachEvent("onclick",Click);
     }
     else{
    
  
oBtn.onclick=null;
     }
 }
 //–>
 </script>
 </head>

<body>
 <button
id="btn">www.51obj.cn&raquo;&raquo;</button>
 </body>

*************************************************************************
在火狐Firefox、opera、IE下阻止冒泡事件是不同的代码的,火狐下使用的是event.stopPropagation(),而IE下使用的是cancelBubble,jQuery
可以使用e.stopPropagation()就可以兼容了,如果是纯粹的JavaScript需要下面的代码来统一:

 
 if (event.stopPropagation)
{

 // this code is for Mozilla and Opera

 event.stopPropagation();

 }

 else if (window.event) {

 // this code is for IE

 window.event.cancelBubble = true;

 }

 
 //就可以兼容哦

 $("#msg").bind("click", function(e)
{

  
alert("div
click");

 e.stopPropagation();

  
});


************************************************************************* event.preventDefault()
 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。例如,如果 type 属性是
"submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调用该方法,可以阻止提交表单。注意,如果 Event 对象的
cancelable 属性是 fasle,那么就没有默认动作,或者不能阻止默认动作。无论哪种情况,调用该方法都没有作用。
 
 event.stopPropagation()
 该方法将停止事件的传播,阻止它被分派到其他 Document 节点。在事件传播的任何阶段都可以调用它。注意,虽然该方法不能阻止同一个
Document 节点上的其他事件句柄被调用,但是它可以阻止把事件分派到其他节点。
 
 event是DOM的事件方法,所以不是单独使用,比如指定DOM
游客

返回顶部