JQuery阻止冒泡事件on绑定中异常情况分析

科普下事件冒泡以及默认行为,以下面例子举列子:

事件冒泡:当点击内部button元素时,会触发自身及外层 a的点击事件,这就是事件冒泡引起的。事件会随着 DOM 的层次结构依次向上传播。

事件冒泡可能会引起意料之外的效果,有时候需要阻止事件的冒泡行为。

默认行为:例子中a的href跳转链接就是所谓的默认行为,或者是表单form的提交。


JQuery中阻止冒泡常用到的有以下3个方法:

1:event.stopPropagation();  只阻止了冒泡事件, 默认行为没有阻止

2:event.preventDefault();     只阻止了默认事件,冒泡事件没有阻止

3:return false;                       冒泡事件和默认事件都阻止


具体对应列子:

1:event.stopPropagation();

1 <body>
2         <a id="p" href="http://www.baidu.com" target="_blank">我是超级链接<button id="sub">子按钮</button></a>
3         <div id="text">
4         </div>
5 </body>
 1 <script>
 2         $(function(){
 3             $("#p").click(function(event){
 4                 $("#text").append("<p>父亲元素被点击</p>");
 5             })
 6
 7             $("#sub").click(function(event){
 8                 $("#text").append("<p>子元素被点击</p>");
 9                 event.stopPropagation();  //只阻止了冒泡事件, 默认默认行为没有阻止
10
11             })
12         })
13     </script>

效果截图:

默认点击父亲元素:

默认点击子元素,事件冒泡了:

加上event.stopPropagation(),可以看到阻止了父亲的单击事件,但是没有阻止父亲a元素hreaf的默认行为,也就是打开新的窗口:


2:event. preventDefault();

 1 <script>
 2         $(function(){
 3             $("#p").click(function(event){
 4                 $("#text").append("<p>父亲元素被点击</p>");
 5             })
 6
 7             $("#sub").click(function(event){
 8                 $("#text").append("<p>子元素被点击</p>");
 9                 event.preventDefault(); //只阻止了默认事件,冒泡事件没有阻止
10             })
11         })
12 </script>

event. preventDefault()加上后,有阻止了默认行为,没有打开新的href窗口,但是没有阻止冒泡事件,父亲的click还是触发了:



3:return false;

 1 <script>
 2         $(function(){
 3             $("#p").click(function(event){
 4                 $("#text").append("<p>父亲元素被点击</p>");
 5             })
 6
 7             $("#sub").click(function(event){
 8                 $("#text").append("<p>子元素被点击</p>");
 9                 return false;         //冒泡事件和默认事件都阻止
10             })
11         })
12 </script>

return false加上后既没有冒泡,也没有打开新窗口:


以上就是工作上经常用到的阻止冒泡和默认行为的方法。实际情况根据需求确定使用哪种方法

这里再说明一下如果是动态生成的元素用on来绑定事件,遇到的阻止冒泡的一些问题,大家参考一下下面是我测试的几个列子:

1:父亲跟孩子同时用on来绑定:

A:绑定的父节点不是同一个,父亲绑定的父元素更外面(绑定body):

1 <body id="body">
2         <div id="bb">
3         <a id="p" href="http://www.baidu.com" target="_blank" >我是超级链接<button id="sub">子按钮</button></a>
4         </div>
5         <div id="text">
6         </div>
7     </body>
 1 <script>
 2         $(function(){
 3             /父亲节点a绑定到body中
 4             $("#body").on("click","#p",function(event){
 5                 $("#text").append("<p>父亲元素被点击</p>");
 6             })
 7             //孩子节点绑定在div中
 8             $("#bb").on("click","#sub",function(event){
 9                 $("#text").append("<p>子元素被点击</p>");
10                 event.stopPropagation();  //只阻止了冒泡事件, 默认默认行为没有阻止
11             })
12         })
13 </script>

测试结果:有阻止冒泡事件

B:绑定的父节点不是同一个,孩子绑定的父元素更外面(绑定body)

 1 <script>
 2         $(function(){
 3             /父亲节点a绑定到div中
 4             $("#bb").on("click","#p",function(event){
 5                 $("#text").append("<p>父亲元素被点击</p>");
 6             })
 7             //孩子节点绑定在body中
 8             $("#body").on("click","#sub",function(event){
 9                 $("#text").append("<p>子元素被点击</p>");
10                 event.stopPropagation();  //只阻止了冒泡事件, 默认默认行为没有阻止
11             })
12         })
13 </script>

测试结果:阻止冒泡失败,并且是父亲元素a的click先触发

C:绑定的父节点是同一个:

都绑定在body或者div上,测试结果正常,有阻止冒泡事件:

2:父亲直接写onclick事件,孩子直接用on绑定

1 <body id="body">
2         <div id="bb">
3         <a id="p" href="http://www.baidu.com" target="_blank" onclick="test()">我是超级链接<button id="sub">子按钮</button></a>
4         </div>
5         <div id="text">
6         </div>
7 </body>
 1 <script>
 2         $(function(){
 3             $("#bb").on("click","#sub",function(event){
 4                 $("#text").append("<p>子元素被点击</p>");
 5                 event.stopPropagation();  //只阻止了冒泡事件, 默认默认行为没有阻止
 6             })
 7         })
 8         function test(){
 9             $("#text").append("<p>父亲元素被点击</p>");
10         }
11 </script>

测试结果:阻止冒泡失败,并且是父亲元素a的click先触发

3:孩子直接写onclick事件,父亲直接用on绑定

1 <body id="body">
2         <div id="bb">
3         <a id="p" href="http://www.baidu.com" target="_blank">我是超级链接<button id="sub" onclick="test()">子按钮</button></a>
4         </div>
5         <div id="text">
6         </div>
7 </body>
 1 <script>
 2         $(function(){
 3             //父亲绑定到body
 4             $("#body").on("click","#p",function(event){
 5                 $("#text").append("<p>父亲元素被点击</p>");
 6             })
 7         })
 8         function test(){
 9             $("#text").append("<p>子元素被点击</p>");
10         }
11 </script>

测试结果:阻止冒泡失败


好了,以上有涉及on绑定做的测试总结如下:

1:父亲跟孩子同时用on来绑定:

A:绑定的父节点不是同一个,父亲绑定的父元素更外面(绑定body)      阻止冒泡事件成功

B:绑定的父节点不是同一个,孩子绑定的父元素更外面(绑定body)  阻止冒泡失败,并且是父亲元素a的click先触发

C:绑定的父节点是同一个:                                                                   阻止冒泡事件成功

2:父亲直接写onclick事件,孩子直接用on绑定                                    阻止冒泡失败,并且是父亲元素a的click先触发

3:孩子直接写onclick事件,父亲直接用on绑定                                    阻止冒泡失败

常规JQuery中阻止冒泡常用到的有以下3个方法:

1:event.stopPropagation();  只阻止了冒泡事件, 默认行为没有阻止

2:event.preventDefault();     只阻止了默认事件,冒泡事件没有阻止

3:return false;                       冒泡事件和默认事件都阻止

时间: 2024-09-30 11:17:45

JQuery阻止冒泡事件on绑定中异常情况分析的相关文章

jquery阻止冒泡事件:$(&#39;span&#39;).bind(&quot;click&quot;,function(event){event.stopPropagation();})(有用源)

冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. <body> <div id="content"> 外层div元素 <span>内层span元素</span> 外层div元素 </div> <div id="msg"></div> </body> <script type="text/javascript"> $(funct

点击tr实现选择checkbox功能,点击checkobx的时候阻止冒泡事件, jquery给checkbox添加checked属性或去掉checked属性不能使checkobx改变状态

给tr添加点击事件,使用find方法查找tr下的所有层级的元素,children只查找下一层级的元素,所以使用find.find的返回值为jquery对象,在这个项目中不知道为什么使用jquery给checkbox添加checked属性或去掉checked属性不能使checkobx改变状态,所以我就把jquery对象转换为DOM对象,怎么转呢?jquery对象[0]或者get(0)就转换成DOM对象,然后直接.checked返回true或false就可以判断checkbox是否选中了.然后判断状

jquery的冒泡事件event.stopPropagation()

js中的冒泡事件与事件监听 冒泡事件 js中“冒泡事件”并不是能实际使用的花哨技巧,它是一种对js事件执行顺序的机制,“冒泡算法”在编程里是一个经典问题,冒泡算法里面的冒泡应该 说是交换更加准确:js里面的“冒泡事件”才是真正意义上的“冒泡”,它从DOM最低层逐层遍历树,然后附加相应事件.以下面代码为例: <title>冒泡事件</title><script type="text/javascript">function Add(sText){   

DOM2级事件对象、添加事件、阻止默认事件、阻止冒泡事件、获取事件对象目标的兼容处理

事件对象——兼容处理 1 /* 2 * 功能: 事件对象兼容 3 * 参数: 表示常规浏览器的事件对象e 4 */ 5 function getEvent(e) { 6 7 // 如果存在e存在,直接返回,否则返回window.event 8 return e || window.event; 9 } 获取事件所对应的目标——兼容处理 1 /* 2 3 * 功能: 获取事件所对应的目标 4 5 * 参数: 表示常规浏览器的事件对象e 6 7 */ 8 9 function getTargetBy

阻止冒泡事件demo

<!doctype html> <html> <head> <style> .box{width:200px;height:200px;background-color:green;} span{display:block;width:100px;height:30px;background-color:skyblue;} </style> <script src="jquery-1.7.2.min.js"><

IE与火狐下兼容(阻止冒泡事件)

function stopEvent(){ //阻止冒泡事件 //取消事件冒泡 var e=arguments.callee.caller.arguments[0]||event; //若省略此句,下面的e改为event,IE运行可以,但是其他浏览器就不兼容 if (e && e.stopPropagation) { // this code is for Mozilla and Opera e.stopPropagation(); } else if (window.event) { /

javascript, jQuery阻止默认事件和冒泡事件

事件冒泡(event bubbling) 事件冒泡是指一个元素上的事件被触发,然后这个事件按嵌套顺序在父级元素上触发,直至document根节点. 例如: <!DOCTYPE html> <html> <head> <title>Event Bubbling Example</title> </head> <body> <div id="myDiv">Click Me</div>

jQuery阻止冒泡和HTML默认操作

jQuery是一个快捷简便的JavaScript框架,说道框架可以直接理解为就是对原来底层的东西进行了封装使得开发者能够利用这个框架快速开发. 1:jQuery是一个快捷简便的JavaScript框架,说道框架可以直接理解为就是对原来底层的东西进行了封装使得开发者能够利用这个框架快速开发. 2:在当今的各个浏览器中都支持事件的冒泡,所谓的冒泡可以这样理解: 条件:外层有一个DIV元素,在内层有一个P元素,他两存在这样的关系:DIV是P元素的父元素,而P是外层DIV的子元素,他们之间存在包含和被包

冒泡事件 阻止冒泡事件

什么是冒泡事件? 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡:这个事件从原始元素开始一直冒泡到DOM树的最上层. 举个栗子: 1 <html xmlns="http://www.w3.org/1999/xhtml"> 2 <head> 3 <title>阻止冒泡</title> 4 <script src="script/jquery-1