博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Js冒泡事件详解及阻止
阅读量:6669 次
发布时间:2019-06-25

本文共 2151 字,大约阅读时间需要 7 分钟。

Js冒泡机制是指如果某元素定义了事件A,如click事件,如果触发了事件之后,没有阻止冒泡事件,那么事件将向父级元素传播,触发父类的click函数。 

如下例所示: 
    <html> 
    <script type="text/javascript" src="jquery-1.7.1.js"></script> 
    <script> 
    function ialertdouble(e) { 
    alert('innerdouble'); 
    stopBubble(e); 
    } 
     
    function ialertthree(e) { 
    alert('innerthree'); 
    stopBubbleDouble(e); 
    } 
     
    function stopBubble(e) { 
    var evt = e||window.event; 
    evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡 
    } 
     
    function stopBubbleDouble(e) { 
    var evt = e||window.event; 
    evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡 
    evt.preventDefault();//阻止浏览器默认行为,这样链接就不会跳转 
    } 
     
    $(function() { 
    //方法一 
    //$('#jquerytest').click(function(event) { 
    // alert('innerfour'); 
    // event.stopPropagation(); 
    // event.preventDefault(); 
    //}); 
     
    //方法二 
    $('#jquerytest').click(function() { 
    alert('innerfour'); 
    return false; 
    }); 
    }); 
    </script> 
    <div οnclick="alert('without');">without 
    <div οnclick="alert('middle');">middle 
    <div οnclick="alert('inner');">inner</div> 
    <div οnclick="ialertdouble(event)">innerdouble</div> 
    <p><a href='http://www.baidu.com' οnclick="ialertthree(event)">innerthree</a></p> 
    <p id='jquerytest'><a href='http://www.baidu.com'>innerfour</a></p> 
    </div> 
    </div> 
    </html> 
当你点击inner的时候,会依次弹出‘inner’,‘middle’和‘without’。这就是事件冒泡。 
从直观上来看,也是这样的,因为最里层的区域是在父级节点中的,点击了子级节点的区域,其实也是点击了父级节点的区域,所以事件会传播起来。 
其实,很多的时候,我们并不想事件冒泡,因为这样会同时触发几个事件。 
接下来:我们点击innerdouble。就会发现她并没有冒泡,因为她在调用的方法ialertdouble()中调用了stopBubble()方法,方法通过判断浏览器类型(Ie通过cancleBubble() 、firefox通过stopProgation())来阻止冒泡。 
但如果是链接的话,我们会发现她也会阻止冒泡,但是会跳转,这就是浏览器的默认行为。需要借助preventDefault()方法来阻止。具体可以查看ialertthree()。 
目前主流的都是借助jquery来绑定click事件的,这样的话,就简单多了。 
我们可以在点击事件时传入参数event,然后直接 
    event.stopPropagation(); 
    event.preventDefault(); //没有链接不需要加这个。 
这样就可以了。 
框架就是好,其实还有更简单的,在事件处理程序中返回false,这是对在事件对象上同时调用stopPropagation()和preventDefault()的一种简写方式。 
【详细代码见上面,记得载入jquery.js。】 
其实也还可以在每个click事件中加入判断: 
    $('#id').click(function(event){ 
    if(event.target==this){ 
    //do something 
    } 
    }) 
解析:事件处理程序中的变量event保存着事件对象。而event.target属性保存着发生事件的目标元素。这个属性是DOM API中规定的,但是没有被所有浏览器实现 。jQuery对这个事件对象进行了必要的扩展,从而在任何浏览器中都能够使用这个属性。通过.target,可以确定DOM中首先接收到事件的元素(即实际被单击的元素)。而且,我们知道this引用的是处理事件的DOM元素,所以可以编写以上代码。 
不过推荐使用return false,Jquery绑定事件的话。 

转载地址:http://bsoxo.baihongyu.com/

你可能感兴趣的文章
灵活就业协议影响应届身份吗,档案应该如何处理
查看>>
校招开篇第一次面试——打响校招的第一枪(二)
查看>>
SQLServer函数 left()、charindex()、stuff()的使用
查看>>
高效能人士
查看>>
C语言博客作业2--循环结构
查看>>
Unity 框架篇
查看>>
iOS自定义发送消息输入框
查看>>
EasyUI笔记(五)表单
查看>>
电动汽车与ADAS
查看>>
微信jsapi支付
查看>>
html禁止缓存代码
查看>>
js 所有事件列表
查看>>
EntityFrameWork Parameter '@columnType' must be defined.
查看>>
30个提高Web程序执行效率的好经验
查看>>
JavaScript DOM 编程艺术(第2版)读书笔记(5)
查看>>
工作流开发使用问题汇总
查看>>
常用Build-in Keywords
查看>>
leetcode — edit-distance
查看>>
第一次作业:基于Linux进程模型的分析
查看>>
贝叶斯学习1
查看>>