`

简析JavaScript事件、以及捕获和冒泡

阅读更多

在浏览器文档模型DOM中,事件是指因为某种具体的交互行为发生,由被作用的元素发出,再由浏览器响应的过程。常见的事件有:click,onmouseover,onblur等等。

 

DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM事件流。

按照DOM事件流的观点,事件在树中传播的方向就有两个,一个是从根结点向子结点流动,以及子结点向根结点传播的方向。前者是Netscape Navigator对事件流的实现:捕获型事件(Capturing),后者是IE的实现方式,即冒泡型事件(Bubbling)(下图作者小小子 )。

DOM标准事件模型:

因为两个不同的模型都有其优点和解释,DOM标准支持捕获型与冒泡型,可以说是它们两者的结合体。它可以在一个DOM元素上绑定多个事件处理器,并且在处理函数内部,this关键字仍然指向被绑定的DOM元素,另外处理函数参数列表的第一个位置传递事件event对象。

首先是捕获式传递事件,接着是冒泡式传递,所以,如果一个处理函数既注册了捕获型事件的监听,又注册冒泡型事件监听,那么在DOM事件模型中它就会被调用两次。

在注册事件时主要有三种方法:

1.HTML挂载法。

<div onclick=”alert(this.innerHTML);”>内容<div>
 

这是很普遍的做法,主要优点是方便,容易理解。但是最近有观点认为这种方法对html的web语义产生了破坏,建议将事件注册写到js模块中,从而将html与js分离。

2.js赋值法。

element.onclick = function(){alert(this.innerHTML);}
 

注意:以上两种方法只支持事件冒泡方式,不支持捕获方式。

3.添加事件监听方法。

element.addEventListener(‘click’, observer, useCapture);
 

addEventListener方法接受三个参数。第一个参数是事件名称,值得注意的是,这里事件名称与IE的不同,事件名称是没’on’开头的 ;第二个参数observer是回调处理函数;第三个参数注明该处理回调函数是在事件传递过程中的捕获阶段被调用还是冒泡阶段被调用,true表示注册到捕获阶段,false表示注册到冒泡阶段。

移除已注册的事件监听器调用element的removeEventListener即可,参数不变.

element.removeEventListener(‘click’, observer, useCapture);
 

 特别的,在IE中使用attachEvent方法来实现。

element.attachEvent(‘onclick’, observer);
 

attachEvent接受两个参数。第一个参数是事件名称,第二个参数observer是回调处理函数。这里得说明一下,有个经常会出错的地 方,IE下利用attachEvent注册的处理函数调用时this指向不再是先前注册事件的元素,这时的this为window对象了。IE只支持事件注册到冒泡阶段。

要移除先前注册的事件的监听器,调用element的detachEvent方法即可,参数相同。

element.detachEvent(‘onclick’, observer); 

事件注册到不同阶段的举例,下面是典型的冒泡方式:

<p onclick="javascript:alert('外面的p被点击!')">
<input type="button" value="注册到冒泡阶段,点击我查看效果" onclick="javascript:alert('里面的button被点击!')"/>
</p>
 

 下面是注册到冒泡阶段的代码,使用了addEventListener方法。注意addEventListener的第三个参数在这里是true,这意味 着将事件click注册到了捕获阶段,也就是外面的p将先得到这个事件,然后才是内层的button。(以下例子请采用Firefox或chrome等非 ie浏览器测试)

<p id="js_out2">
 <input type="button" id="js_in2" value="注册到捕获阶段,点击我查看效果"/>
</p>
<script type="text/javascript">
document.getElementById("js_out2").addEventListener('click', function(){alert('外面的div被点击!');}, true);
document.getElementById("js_in2").addEventListener('click',function(){alert('里面的div被点击!');},true);
</script>
 

再放两个例子增加读者对捕获和冒泡的印象。

1.冒泡事件和停止冒泡向上传播的例子

2.捕获事件并停止向下传播的例子

 

 

[转自 :http://www.ilovespringna.com/?p=34023 ]

  • 大小: 9 KB
  • 大小: 15.1 KB
  • 大小: 10.2 KB
分享到:
评论

相关推荐

    javascript事件委托的用法及其好处简析

    本文为大家简单介绍了javascript事件委托的用法及其好处,供大家参考,具体内容如下 事件委托:利用冒泡的原理,把事件加到父级上,触发执行效果, 好处:提高性能,新添加的元素还会有之前的事件。 event对象:事件...

    javascript大事托付的用法及其好处简析_.docx

    JavaScript中的“大事托付”(Delegation)是一种事件处理策略,它利用事件冒泡的特性来提高代码效率和性能。事件冒泡是指事件从最深的节点开始,然后逐级向上层元素传播事件。在大型或动态的DOM结构中,大事托付...

    校园暴力事件简析.pdf

    校园暴力事件简析.pdf

    js中键盘事件实例简析

    本文的实例简析不仅帮助初学者理解了JavaScript中键盘事件的基本操作,还提供了一些进阶的提示和技巧。对于需要深入学习JavaScript键盘事件处理的开发者来说,本文是一个很好的起点。通过实践这样的基础实例,开发者...

    javascript实现自动填写表单实例简析

    JavaScript 实现自动填写表单的知识点涵盖面很广,涉及到了前端页面元素的定位、JavaScript 的 DOM 操作,以及如何利用浏览器内置功能来方便地使用这些脚本。下面将详细解析这些知识点。 首先,页面元素定位是关键...

    Java中的泛型简析实战.zip

    Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战...

    NR PRACH信道和随机接入流程简析V2.0.pdf

    NR旨在支持更高的数据速率、更低的延迟以及更高的系统容量和大规模设备连接。本文将探讨NR中的一个关键组成部分:PRACH(Physical Random Access Channel,物理随机接入信道)信道,及其相关的随机接入流程。 首先...

    JavaScript mapreduce工作原理简析

    JavaScript MapReduce工作原理简析 MapReduce是一种编程模型,由谷歌在2004年的OSDI会议上提出,它主要用于大规模数据集的并行处理。该模型借鉴了函数式编程的概念,将复杂的数据处理任务分解为两个主要阶段:Map...

    金融事件研究的数量分析方法简析.pdf

    Ray Ball和Philip Brown以及Eugene Fama等人的工作进一步推动了这一领域的发展,他们引入了现代事件研究的框架,特别是关于信息含量和股利支付的分析。 金融事件研究的一般步骤包括以下几个阶段: 1. **定义事件...

    嘉世咨询2024休闲食品行业简析报告.pdf

    【嘉世咨询】2024休闲食品行业简析报告.pdf【嘉世咨询】2024休闲食品行业简析报告.pdf【嘉世咨询】2024休闲食品行业简析报告.pdf【嘉世咨询】2024休闲食品行业简析报告.pdf【嘉世咨询】2024休闲食品行业简析报告.pdf...

    嘉世咨询2024智能音箱市场简析报告.pdf

    【嘉世咨询】2024智能音箱市场简析报告.pdf【嘉世咨询】2024智能音箱市场简析报告.pdf【嘉世咨询】2024智能音箱市场简析报告.pdf【嘉世咨询】2024智能音箱市场简析报告.pdf【嘉世咨询】2024智能音箱市场简析报告.pdf...

    简析一种SOA动态实现框架

    3. 声明式事件处理:通过声明方式定义和处理事件,简化系统中的事件驱动流程。 4. 数据格式转换:自动处理不同客户机和服务间的数据格式差异,实现数据的无缝交换。 5. 集中资源管理:集中管理SOA资源,如服务、...

    简析Win8网络和共享中心.docx

    简析Win8网络和共享中心.docx

    STL简析入门基础学习

    STL简析STL简析STL简析基础学习STL简析基础学习STL简析基础学习STL简析基础学习STL简析基础学习STL简析基础学习

    Web3.0概念下的场景生态简析.pdf

    Web3.0概念下的场景生态简析 Web3.0概念是指下一代互联网的发展方向,旨在解决用户与用户之间的信息互动、提升信息的传递效率、实现信息交互过程中的“可信”与“沉浸”。在当下,Web3.0概念受到关注的原因来自于现...

    简析 createDelegate

    总结来说,`createDelegate`是一个实用的工具,它帮助开发者在JavaScript中维护函数调用的上下文,尤其是在处理事件处理和异步回调时。通过学习和理解`createDelegate`的工作原理和用法,我们可以编写出更加健壮和可...

Global site tag (gtag.js) - Google Analytics