科普下事件冒泡以及默认行为,以下面例子举列子:
    事件冒泡:当点击内部button元素时,会触发自身及外层 a的点击事件,这就是事件冒泡引起的。事件会随着 DOM 的层次结构依次向上传播。

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

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

JQuery中阻止冒泡常用到的有以下3个方法:
1:event.stopPropagation();  只阻止了冒泡事件, 默认行为没有阻止
2:event.preventDefault();     只阻止了默认事件,冒泡事件没有阻止
3:return false;                       冒泡事件和默认事件都阻止
 

具体对应列子:
1:event.stopPropagation();
 <body>
<a id="p" href="http://www.baidu.com" target="_blank">我是超级链接<button id="sub">子按钮</button></a>
<div id="text">
</div>
</body>
 <script>
$(function(){
$("#p").click(function(event){
$("#text").append("<p>父亲元素被点击</p>");
}) $("#sub").click(function(event){
$("#text").append("<p>子元素被点击</p>");
event.stopPropagation(); //只阻止了冒泡事件, 默认默认行为没有阻止 })
})
</script>
效果截图:
默认点击父亲元素:
 
默认点击子元素,事件冒泡了:
 
加上event.stopPropagation(),可以看到阻止了父亲的单击事件,但是没有阻止父亲a元素hreaf的默认行为,也就是打开新的窗口:

2:event. preventDefault();
 <script>
$(function(){
$("#p").click(function(event){
$("#text").append("<p>父亲元素被点击</p>");
}) $("#sub").click(function(event){
$("#text").append("<p>子元素被点击</p>");
event.preventDefault(); //只阻止了默认事件,冒泡事件没有阻止
})
})
</script>

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


3:return false;

 <script>
$(function(){
$("#p").click(function(event){
$("#text").append("<p>父亲元素被点击</p>");
}) $("#sub").click(function(event){
$("#text").append("<p>子元素被点击</p>");
return false; //冒泡事件和默认事件都阻止
})
})
</script>

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

 

以上就是工作上经常用到的阻止冒泡和默认行为的方法。实际情况根据需求确定使用哪种方法
这里再说明一下如果是动态生成的元素用on来绑定事件,遇到的阻止冒泡的一些问题,大家参考一下下面是我测试的几个列子:
1:父亲跟孩子同时用on来绑定:
    A:绑定的父节点不是同一个,父亲绑定的父元素更外面(绑定body):
 <body id="body">
<div id="bb">
<a id="p" href="http://www.baidu.com" target="_blank" >我是超级链接<button id="sub">子按钮</button></a>
</div>
<div id="text">
</div>
</body>
 <script>
$(function(){
/父亲节点a绑定到body中
$("#body").on("click","#p",function(event){
$("#text").append("<p>父亲元素被点击</p>");
})
//孩子节点绑定在div中
$("#bb").on("click","#sub",function(event){
$("#text").append("<p>子元素被点击</p>");
event.stopPropagation(); //只阻止了冒泡事件, 默认默认行为没有阻止
})
})
13 </script>

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

    B:绑定的父节点不是同一个,孩子绑定的父元素更外面(绑定body)
 <script>
$(function(){
/父亲节点a绑定到div中
$("#bb").on("click","#p",function(event){
$("#text").append("<p>父亲元素被点击</p>");
})
//孩子节点绑定在body中
$("#body").on("click","#sub",function(event){
$("#text").append("<p>子元素被点击</p>");
event.stopPropagation(); //只阻止了冒泡事件, 默认默认行为没有阻止
})
})
</script>

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

 
  C:绑定的父节点是同一个:
都绑定在body或者div上,测试结果正常,有阻止冒泡事件:
2:父亲直接写onclick事件,孩子直接用on绑定
 <body id="body">
<div id="bb">
<a id="p" href="http://www.baidu.com" target="_blank" onclick="test()">我是超级链接<button id="sub">子按钮</button></a>
</div>
<div id="text">
</div>
</body>
 <script>
$(function(){
$("#bb").on("click","#sub",function(event){
$("#text").append("<p>子元素被点击</p>");
event.stopPropagation(); //只阻止了冒泡事件, 默认默认行为没有阻止
})
})
function test(){
$("#text").append("<p>父亲元素被点击</p>");
}
</script>

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

3:孩子直接写onclick事件,父亲直接用on绑定
 <body id="body">
<div id="bb">
<a id="p" href="http://www.baidu.com" target="_blank">我是超级链接<button id="sub" onclick="test(event)">子按钮</button></a>
</div>
<div id="text">
</div>
</body>
 <script>
$(function(){
//父亲绑定到body
$("#body").on("click","#p",function(event){
$("#text").append("<p>父亲元素被点击</p>");
})
})
function test(event){ //event在onclick那边直接传入,这样才支持所有浏览器
$("#text").append("<p>子元素被点击</p>");
         event.stopPropagation();
}
</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;                       冒泡事件和默认事件都阻止
 

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

  1. jquery阻止冒泡事件行为发生

    <div onclick="a()"> <p onclick="b()"></p> </div> div和p元素 ...

  2. jquery 阻止冒泡事件和阻止默认事件

    jQuery 冒泡和默认事件: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  3. 【笔记】jquery阻止冒泡事件发生的语句

    时间触发时会执行两个步骤:1.捕获 2.冒泡,而很多浏览器包括jquery都不支持捕获动作所以只能执行冒泡动作. 所谓冒泡就是当点击就是事件的执行顺序,本人的理解为:但某一元素触发时间时它的祖先元素( ...

  4. jquery阻止冒泡事件:$('span').bind("click",function(event){event.stopPropagation();})(有用源)

    冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. <body> <div id="content"> 外层div元素 <span> ...

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

    给tr添加点击事件,使用find方法查找tr下的所有层级的元素,children只查找下一层级的元素,所以使用find.find的返回值为jquery对象,在这个项目中不知道为什么使用jquery给c ...

  6. 关于jquery stopPropagation()阻止冒泡事件

    我们经常会遇到点击两个或者多个重叠的层事件的时候,往往点击最里的的一层会接连触发外面的点击事件.这时候就需要用到stopPropagation事件即阻止冒泡事件html代码如下<!DOCTYPE ...

  7. jquery的冒泡事件event.stopPropagation()

    js中的冒泡事件与事件监听 冒泡事件 js中“冒泡事件”并不是能实际使用的花哨技巧,它是一种对js事件执行顺序的机制,“冒泡算法”在编程里是一个经典问题,冒泡算法里面的冒泡应该 说是交换更加准确:js ...

  8. 微信小程序--阻止冒泡事件

    微信小程序事件的使用方式 在组件中绑定一个事件处理函数. 如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数. <view id="tapTest ...

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

    事件对象——兼容处理 /* * 功能: 事件对象兼容 * 参数: 表示常规浏览器的事件对象e */ function getEvent(e) { // 如果存在e存在,直接返回,否则返回window. ...

随机推荐

  1. Android学习笔记(十二)——实战:制作一个聊天界面

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...

  2. [转载]Linux下tomcat的catalina.out文件过大,以及目录更改解决办法

    原文链接:http://liyan0524.iteye.com/blog/1285644 方法1—分割流 使用cronolog工具切分Tomcat的catalina.out日志文件 cronolog一 ...

  3. PictureCutting图片批量裁切(裁剪)工具

    PictureCutting图片批量裁切(裁剪)工具 写这个工具的原因是因为在获取一个软件的皮肤包中的图片的时候需要进行批量的裁切工作,而有没有找到在linux下简单好用的工具,干脆就用QT写了一个. ...

  4. django的跨站请求访问

    一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功 ...

  5. 同级兄弟元素之间的CSS控制

    为了实现这个导航效果:选中菜单中某一项,隐藏掉自身的左边背景线条,同时让他的下一个兄弟元素也隐藏掉线条. 有一种选择器就叫兄弟元素选择器,分为临近兄弟和普通兄弟. 临近兄弟:用 + 表示,只匹配该元素 ...

  6. jdbc事务处理和连接池

    JDBC: * JDBC概念:Java DataBase Connectivity(Java数据库连接) SUN公司提供的一组连接数据库API. * JDBC开发步骤: * 1.注册驱动. * 2.获 ...

  7. android SDK manager 无法获取更新版本列表

    打开SDK Manager---Tools---Options,填入如下代理和端口,勾选选项也如下. 网址:mirrors.neusoft.edu.cn 端口:80 99%是成功的 参考:http:/ ...

  8. Selenium WebDriver 处理table

    首先,html table是由 table 元素以及一个或多个 tr.th 或 td 元素组成. for example: 这是一个简单的html table: 源码如下: <html> ...

  9. InnoDB O_DIRECT选项漫谈(一)【转】

    本文来自:http://insidemysql.blog.163.com/blog/static/2028340422013671186977/   最近和文件系统内核开发人员做技术交流,对O_DIR ...

  10. gtk+2.24.0-glib-2.28.1-staticLib-mingw32-x86-2016-08-10.7z

    GTK_PATH=D:/MSYS/opt/gtk+2.24.0-staticLib b1-static.sh --------------------------------------------- ...