用JS阻止事件冒泡

 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。

可以用JS来阻止js事件冒泡。因为浏览器的差异IE和FF的JS写法有点不一样。
IE用cancelBubble=true来阻止而FF下需要用stopPropagation方法。
下一下完整的代码:

[html]  view plain copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <title>无标题文档</title>  
  6. <script type="text/javascript">  
  7. function aaaclick(){  
  8.     alert("td click");  
  9. }  
  10. function bbbclick(evt){  
  11.     alert("td click");  
  12.     if (window.event) {  
  13.         event.cancelBubble = true;  
  14.     }else if (evt){  
  15.         evt.stopPropagation();  
  16.     }  
  17. }  
  18. function trclick(){  
  19.     alert("tr click");  
  20. }  
  21.   
  22. function tableclick(){  
  23.     alert("table click");  
  24. }  
  25. </script>  
  26.   
  27. <style type="text/css">  
  28. <!--  
  29. .tab {  
  30.     border: 1px solid #0066FF;  
  31.     cellpadding:0px;  
  32.     cellspacing:0px;  
  33. }  
  34. .tab td{  
  35.     border: 1px solid #0066FF;  
  36. }  
  37. -->  
  38. </style>  
  39. </head>  
  40.   
  41. <body>  
  42. <p>点击aaaa会触发上层的onclick事件,点击bbbb不会触发上层onclick事件</p>  
  43. <table width="204" onclick="tableclick()" class="tab">  
  44.   <tr >  
  45.     <td width="96"> </td>  
  46.     <td width="96"> </td>  
  47.   </tr>  
  48.   <tr onclick="trclick()">  
  49.     <td onclick="aaaclick()">aaaa</td>  
  50.     <td onclick="bbbclick(event)">bbbbb</td>  
  51.   </tr>  
  52.   <tr>  
  53.     <td> </td>  
  54.     <td> </td>  
  55.   </tr>  
  56. </table>  
  57.   
  58. </body>  
  59. </html>  


  60. JQuery 
  61. 1. 事件目标

    现在,事件处理程序中的变量event保存着事件对象。而event.target属性保存着发生事件的目标元素。这个属性是DOM API中规定的,但是没有被所有浏览器实现 jQuery对这个事件对象进行了必要的扩展,从而在任何浏览器中都能够使用这个属性。通过.target,可以确定DOM中首先接收到事件的元素(即实际被单击的元素)。而且,我们知道this引用的是处理事件的DOM元素,所以可以编写下列代码:
    $(document).ready(function(){
     $('#switcher').click(function(event){
      $('#switcher .button').toggleClass('hidden');
      })
     })
      
    $(document).ready(function(){
     $('#switcher').click(function(event){
      if(event.target==this){
      $('#switcher .button').toggleClass('hidden');
      }
      })
     })
    此时的代码确保了被单击的元素是<div id="switcher"> ,而不是其他后代元素。现在,单击按钮不会再折叠样式转换器,而单击边框则会触发折叠操作。但是,单击标签同样什么也不会发生,因为它也是一个后代元素。实际上,我们可以不把检查代码放在这里,而是通过修改按钮的行为来达到目标 

    2. 停止事件传播

    事件对象还提供了一个.stopPropagation()方法,该方法可以完全阻止事件冒泡。与.target类似,这个方法也是一种纯JavaScript特性,但在跨浏览器的环境中则无法安全地使用 。不过,只要我们通过jQuery来注册所有的事件处理程序,就可以放心地使用这个方法。

    下面,我们会删除刚才添加的检查语句event.target == this,并在按钮的单击处理程序中添加一些代码:

    $(document).ready(function(){
     $('#switcher .button').click(funtion(event){
      //……
       event.stopPropagation();
      })
     }) 

      同以前一样,需要为用作单击处理程序的函数添加一个参数,以便访问事件对象。然后,通过简单地调用event.stopPropagation()就可以避免其他所有DOM元素响应这个事件。这样一来,单击按钮的事件会被按钮处理,而且只会被按钮处理。单击样式转换器的其他地方则可以折叠和扩展整个区域。

    3. 默认操作

    如果我们把单击事件处理程序注册到一个锚元素,而不是一个外层的<div>上,那么就要面对另外一个问题:当用户单击链接时,浏览器会加载一个新页面。这种行为与我们讨论的事件处理程序不是同一个概念,它是单击锚元素的默认操作。类似地,当用户在编辑完表单后按下回车键时,会触发表单的submit事件,在此事件发生后,表单提交才会真正发生。

    如果我们不希望执行这种默认操作,那么在事件对象上调用.stopPropagation()方法也无济于事,因为默认操作不是在正常的事件传播流中发生的。在这种情况下,.preventDefault()方法则可以在触发默认操作之前终止事件 

    提示 当在事件的环境中完成了某些验证之后,通常会用到.preventDefault()。例如,在表单提交期间,我们会对用户是否填写了必填字段进行检查,如果用户没有填写相应字段,那么就需要阻止默认操作。我们将在第8章详细讨论表单验证。

    事件传播和默认操作是相互独立的两套机制,在二者任何一方发生时,都可以终止另一方。如果想要同时停止事件传播和默认操作,可以在事件处理程序中返回false,这是对在事件对象上同时调用.stopPropagation().preventDefault()的一种简写方式。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值