JS中的事件冒泡——总结
一. 有话要说
事件冒泡这个话题已经被园子里的朋友说透了,已经没什么要讲的了,但是由于呢我这边有个小问题刚好跟这个事件冒泡有关,就突然性想写个总结;一方面是给自己增加印象,另一方面给园子的新手们,提供一些方便 ^_^
二. 事件冒泡
什么是事件冒泡? 定义百度一搜一大把,我就不细讲了;我总结就是:dom行为机制的触发,并且存在上下级元素(父子级),如果不做些特殊操作,就会产生重复触发这个行为机制(事件)
具体表现:
<div style="width:100%;height:700px;">
<div style="width: 200px; height: 50px; border: 1px solid #000;">
</div>
</div>
jq:
$(document).ready(function () {
$("body").bind("click", function () {
alert("body元素被点击了");
});
$("div").bind("click", function () {
alert("div元素被点击了");
});
});
这样运行就会发现,当点击div范围的时候 会先触发div的点击事件,然后再是body的点击事件;为什么?
这是因为当我们为body和div分别绑定点击事件的时候,由于body是div的父元素,当div被点击时,dom会回溯找到它的(div)的父元素,并查看有没有为父元素绑定事件,有则触发,没有就继续查找div的父元素 这样不断的向上回溯查找 这就形成了事件冒泡。
这显然不是我们想到的结果,那怎么样才能做到当点击div的时候就只触发div的点击事件,而不要触发body的点击事件?
解决方案百度,园子里太多了,所以我这里就大概总结了那么几种方法
三. 解决方法
方法1. 直接在子元素(这里的div)js的最后增加一个 return false;
方法2. 当你把方法1的子元素的绑定方法抽出来放在元素上的onclick属性上的时候,方法1就不管用了,那么就要做以下处理:
function Test2(event) {
alert("div元素被点击了");
event = window.event || event;
if (event.stopPropagation) //停止向上传播事件 关于stopPropagation的解释,请点击这stopPropagation
event.stopPropagation();
else
event.cancelBubble = true; //如果浏览器不支持stopPropagation 则设置cancelBubble来取消上传传播事件冒泡
};
方法3. 除了以上方法,还有一个方法值得注意,这个方法一开始我也不知道,是查了资料才知道的
$("body").bind("click", function (e) {
e = e || window.event;
var src = e.target || e.srcElement;
if (src.tagName == "DIV") { //这里可以用属性,只要是符合dom标签属性规则的 比如 id等
//说明是点击了div
alert("div元素被点击了");
}
else {
//是在div范围外点击的
alert("body元素被点击了");
}
});
希望这些对遇到事件冒泡的同学有些帮助 就写到这里了!
JS中的事件冒泡——总结的更多相关文章
- js中阻止事件冒泡和浏览器默认行为
在使用javascript编程时会遇到一个问题,就是当你给html添加事件时,由于浏览器默认的为冒泡型事件触发机制,所以会触发你不想触发的事件.那么通过如下的函数可以解决这个问题.[兼容IE和FF] ...
- JS中的事件冒泡(Bubble)和事件捕获(capture)以及如何阻止事件的冒泡
对“捕获”和“冒泡”这两个概念,通常我们对冒泡了解和使用的会更多一些,因为在我们使用的所有浏览器中,都支持事件冒泡 ,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefo ...
- JS中的事件冒泡和事件捕获
事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target). 事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签. 用图示表示如下: 1.冒泡事件: ...
- js中的事件冒泡
事件冒泡和阻止事件冒泡: 事件冒泡的原理:从实际操作的元素(事件)向上级父元素一级一级执行下去,直到达到document/window,冒泡过程结束.例如:假设我有一个 div 盒子,里面嵌套了1个子 ...
- css 中的事件冒泡
css伪类中的表现类似于事件冒泡的,举个例子,当你滑过一个元素时,他会认为你也滑过了该元素的父元素,即使该元素看起来并没有包含在父元素里面,此处以:hover例子: 效果图: 滑过前: 滑过后: CS ...
- js中的事件委托(事件代理)详解
本文转载:https://www.cnblogs.com/liugang-vip/p/5616484.html#!comments js中的事件冒泡.事件委托是js 中一些需要注意的小知识点,这里结合 ...
- 怎么理解js中的事件委托
怎么理解js中的事件委托 时间 2015-01-15 00:59:59 SegmentFault 原文 http://segmentfault.com/blog/sunchengli/119000 ...
- 看懂此文,不再困惑于 JS 中的事件设计
看懂此文,不再困惑于 JS 中的事件设计 今天刚在关注的微信公众号看到的文章,关于JS事件的,写的很详细也很容易理解,相关的知识点都有总结到,看完就有种很舒畅的感觉,该串起来的知识点都串起来了.反正一 ...
- DOM 以及JS中的事件
[DOM树节点] DOM节点分为三大节点:元素节点,文本节点,属性节点. 文本节点,属性节点为元素节点的两个子节点通过getElment系列方法,可以去到元素节点 [查看节点] 1 document. ...
随机推荐
- VC++开发Windows系统全局钩子
本文的大部分内容属于对一篇网文的实践与练习,同时参考的还有一本书,在此向网文与书的作者表示敬意. 这个程序是一个windows系统键盘监控程序,随着开机自动启动,可以监控系统中各用户的键盘,并将按键记 ...
- django url 路由设置技巧
Django的url使用方法 利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 ...
- python中 使用join()方法 对各种数据类型中元的素进行合并拼接
"连接符".join(列表或元组或字符串或字典) 返回的是一个使用连接符进行拼接的字符串 如果对象是列表,元组,就是以一个下标元素为单位进行拼接 如果对象是字符串,就是一个单词元素 ...
- FunDA(9)- Stream Source:reactive data streams
上篇我们讨论了静态数据源(Static Source, snapshot).这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不安全的资源使用方式.Slick3.x已经增加了支 ...
- 【Java学习笔记】如何写一个简单的Web Service
本Guide利用Eclipse以及Ant建立一个简单的Web Service,以演示Web Service的基本开发过程: 1.系统条件: Eclipse Java EE IDE for Web De ...
- servlet转发与重定向区别
servlet转发与重定向 HttpServletRequest: 表示浏览器向服务器发送的请求报文,由Tomcat创建然后作为参数传递给我们doget,dopost方法. 功能:getParam ...
- HTML+Javascript制作拼图小游戏详解(终)
上次我们已经讲解了制作的原理,并且展示了主要代码. 这次我将完整的代码给大家,仅供参考. HTML部分如下: <!DOCTYPE html> <html lang="en& ...
- Web端测试和移动端测试
之前参加的项目有涉及Web端测试和移动端测试,简单的记录下他们之间的区别: 1.记录bug 在Web端可以通过系统自带的截图和QQ截图等方式来截取bug的图片,对于错误的地方可以用工具自带的标识来 ...
- 为什么程序员老在改 Bug,就不能一次改好吗?
程序员的日常三件事:写Bug.改Bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含Bug. 但是真的有这么多Bug要改吗?就不能一次改完吗? 程序员听这问题后要拍键盘了,还!真! ...
- 【BZOJ4916】神犇和蒟蒻 杜教筛
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4916 第一个询问即求出$\sum_{i=1}^{n} { \mu (i^2)} $,考虑 ...