JavaScript事件冒泡机制和阻止事件冒泡及默认事件
一、阻止事件冒泡:
1、html中加return false
2、js中加return false
3、IE下:window.event.cancelBubble = true;
FF下:event.stopPropagation();
//阻止事件冒泡函数
function stopBubble(evt)
{
var e = evt || window.event;
if (e && e.stopPropagation)
e.stopPropagation()
else
window.event.cancelBubble=true
}
二、阻止默认事件:
1、return false;
2、IE下:window.event.returnValue = false;
FF下:event.preventDefault()
//阻止浏览器的默认行为
function stopDefault( evt ) {
//阻止默认浏览器动作(W3C)
var e = evt || window.event;
if ( e && e.preventDefault )
e.preventDefault();
else //IE中阻止函数器默认动作的方式
window.event.returnValue = false;
return false;
}
return false作用很强大,不仅可以阻止事件冒泡,还可以阻止浏览器的默认行为,还可以减少ie系列的bug。
三、术语简介:
那么什么是默认行为呢?就是浏览器会对一些元素默认给予一定的操作,比如a,input[type='submit']等等,默认行为是在事件绑定事件之后执行的,因为在刷新页面的时候,绑定事件就从历史记录里移出了,所以绑定事件要先执行(查看w3c)。
事件对象,event是事件函数触发产生的局部变量,随事件触发而产生,随事件结束而消失。
事件冒泡,就是当在dom结构中,子元素发生的事件,会沿着dom树神经一直传到document上,而不是单单只在本元素发生事件。
所以,对于事件冒泡和浏览器的默认行为,作为事件对象,自然有他自己的处理方法,e.stopPropagation() 和e.stopImmediatePropagation()都是用来阻止事件冒泡的。只是这两个方法有个区别,就是后面的方法不仅阻止了一个事件的冒泡,也把这个元素上的其他绑定事件也阻止了。而前者只是阻止一个绑定事件的冒泡,而不影响其他绑定事件执行。e.preventDefault()是用来阻止浏览器的默认行为的。
return false很强大,可以同时阻止事件冒泡和浏览器的默认行为。所以,当你需要阻止默认行为,但是又需要让他有事件冒泡行为的时候,你就不能用return false咯。
四、事件冒泡:
在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。
打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,直至到中央法院,最终使你的案件得以处理。
五、事件冒泡有什么作用
1、事件冒泡允许多个操作被集中处理(把事件处理器添加到一个父级元素上,避免把事件处理器添加到多个子级元素上),它还可以让你在对象层的不同级别捕获事件。
【集中处理例子】
<div onclick="eventHandle(event)" id="outSide" style="width:100px; height:100px; background:#000; padding:50px">
<div id="inSide" style="width:100px; height:100px; background:#CCC"></div>
</div>
<script type="text/javascript">
//本例子只在外面盒子定义了处理方法,而这个方法一样可以捕获到子元素点击行为并处理它。假设有成千上万子元素要处理,难道我们要为每个元素加“onclick="eventHandle(event)"”吗?显然没有这种集中处理的方法来的简单,同时它的性能也是更高的。
function eventHandle(e){
var e=e||window.event;
var obj=e.target||e.srcElement;
alert(obj.id+' was click')
}
</script>
2、让不同的对象同时捕获同一事件,并调用自己的专属处理程序做自己的事情,就像老板一下命令,各自员工做自己岗位上的工作去了。
【同时捕获同一事件例子】
<div onclick="outSideWork()" id="outSide" style="width:100px; height:100px; background:#000; padding:50px">
<div onclick="inSideWork()" id="inSide" style="width:100px; height:100px; background:#CCC"></div>
</div>
<script type="text/javascript">
function outSideWork(){
alert('My name is outSide,I was working...');
}
function inSideWork(){
alert('My name is inSide,I was working...');
}
//单击灰色盒子,从这里开始下命令,这样因为冒泡的原因,黑色大盒子也会收到单击事件,并调用了自己的处理程序。如果还有更多盒子嵌套,一样道理。
</script>
六、需要注意什么
1、事件捕获其实有三种方式,事件冒泡只是其中的一种:(1)IE从里到外(inside→outside)的冒泡型事件。(2)Netscape4.0从外到里(outside→inside)的捕获型事件。(3)DOM事件流,先从外到里,再从里到外回到原点(outside→inside→outside)的事件捕获方法。
2、不是所有的事件都能冒泡。以下事件不冒泡:blur、focus、load、unload。
3、事件捕获方式在不同浏览器,甚至同种浏览器的不同版本中是有所区别的。如Netscape4.0采用捕获型事件解决方案,其它多数浏览器则支持冒泡型事件解决方案,另外DOM事件流还支持文本节点事件冒泡。
4、事件捕获到达顶层的目标在不同浏览器或不同浏览器版本也是有区别的。在IE6中HTML是接收事件冒泡的,另外大部分浏览器将冒泡延续到window对象,即……→body→documen→window。
5、阻止冒泡并不能阻止对象默认行为。比如submit按钮被点击后会提交表单数据,这种行为无须我们写程序定制。
JavaScript事件冒泡机制和阻止事件冒泡及默认事件的更多相关文章
- 阻止a标签的默认事件及延伸
先贴一段代码 <html lang="en"> <head> <meta charset="UTF-8"> <meta ...
- Android事件分发机制二:viewGroup与view对事件的处理
前言 很高兴遇见你~ 在上一篇文章 Android事件分发机制一:事件是如何到达activity的? 中,我们讨论了触摸信息从屏幕产生到发送给具体 的view处理的整体流程,这里先来简单回顾一下: 触 ...
- Android事件分发机制详解(2)----分析ViewGruop的事件分发
首先,我们需要 知道什么是ViewGroup,它和普通的View有什么区别? ViewGroup就是一组View的集合,它包含很多子View和ViewGroup,是Android 所有布局的父类或间接 ...
- Android事件分发机制详解(1)----探究View的事件分发
探究View的事件分发 在Activity中,只有一个按钮,注册一个点击事件 [java] view plaincopy button.setOnClickListener(new OnClickLi ...
- 这可能是最简明扼要的 js事件冒泡机制+阻止默认事件 讲解了
哎 js事件冒泡机制和阻止冒泡 阻止默认行为好像永远也整不清楚,记了忘 忘了记...醉了 这篇文章写完以后下次再忘记 就呼自己一巴掌,忘一次一巴掌 首先要明白两个概念——事件和事件流 事件指的是用户或 ...
- javascript -- 阻止默认事件 阻止事件冒泡
1. event.preventDefault(); -- 阻止元素的默认事件.注:a元素的点击跳转的默认事件 , button,radio等表单元素的默认事件 , div 元素没有默认事件 例: ...
- JS如果阻止事件冒泡和浏览器默认事件
原地址:http://missra.com/article/web-57.html 嵌套的标签元素,如果父元素和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下J ...
- js阻止元素的默认事件与冒泡事件
嵌套的div元素,如果父级和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,从而带来一定的影响. 1. event.preventDefault(); -- 阻止元素的默认 ...
- js阻止浏览器、元素的默认事件与js阻止事件冒泡、阻止事件流
嵌套的div元素,如果父级和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下js阻止默认事件与js阻止事件冒泡示例,大家参考使用吧 1. event.prev ...
随机推荐
- windows上springboot打war部署tomcat小记
web项目,需要部署到云主机里去,现在windows里试一下. springboot项目,主要流程就只是打成war包后扔到tomcat里去,但是由于是springboot项目,有一些需要注意的地方,这 ...
- Java时间间隔问题在Android中的使用
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6606720.html 假设我们在做项目的时候,获取到了一段音频,也知道音频长度,那么我们想对音频做一些处理 ...
- CodeDom生成类文件
仅供个人学习 需要先引入System.CodeDom nuget包 using CodeGenerate.Entities; using System; using System.CodeDom; u ...
- C#中的特性 (Attribute) 入门 (一)
C#中的特性 (Attribute) 入门 (一) 饮水思源 http://www.cnblogs.com/Wind-Eagle/archive/2008/12/10/1351746.html htt ...
- 【Performance】chrome调试面板
本篇文章以chrome版本67.0.3396.99为例,说明性能方面的调试.
- 每日踩坑 2018-06-19 AutoMapper简单性能测试
想使用 AutoMapper 类库来做一些映射到 DTO 对象的操作 但既然类似这样的类库内部是用反射来实现的,那么会比较在意性能. 所以来简单测试一下性能. 关于测试结果呢 emmmm 我是比较吃惊 ...
- 洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)
题目链接 \(Description\) 给定一个无向带权连通图,每条边是黑色或白色.求一棵最小权的恰好有K条白边的生成树. \(Solution\) Kruskal是选取最小的n-1条边.而白边数有 ...
- hdu 4858 水题
题意:我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能有多条边,不过一条边的两端必然是不同的节点.每个节点都有一个能量值.现在我们要编写一个项目管理软件 ...
- 解决请求参数的中文乱码问题(get、post)
2018-11-28 在web请求与响应中,会遇到乱码问题,比如填写表单数据时,难免会输入中文,姓名.公司名称等.由于HTML设置了浏览器在传递请求参数时,采用的编码方式是UTF-8,但在解码时采用的 ...
- Digital Adjustment of DC-DC Converter Output Voltage in Portable Applications
http://pdfserv.maximintegrated.com/en/an/AN818.pdf http://www.maximintegrated.com/app-notes/index.mv ...