`
pursue_excellence
  • 浏览: 12589 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JavaScript事件:捕获 VS 冒泡

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

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

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

DOM标准事件模型:首先是捕获式传递事件,接着是冒泡式传递。

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

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

1.HTML挂载法
<div onclick=”alert(this.innerHTML);”>内容<div> 

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

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

2.js赋值法

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

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

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

3.添加事件监听方法(除IE外的浏览器)

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

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

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

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

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

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

在IE中使用attachEvent方法来实现:

element.attachEvent(‘onclick’, observer); 

element.attachEvent(‘onclick’, observer);

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

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

element.detachEvent(‘onclick’, observer);  

element.detachEvent(‘onclick’, observer);

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

<p onclick="javascript:alert('外面的p被点击!')"> 

          <input type="button" value="注册到冒泡阶段,点击我查看效果"

            onclick="javascript:alert('里面的button被点击!')"/> 

</p> 

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

下面是注册到冒泡阶段的代码,使用了addEventListener方法。注意addEventListener的第三个参数在这里是true,这意味着将事件click注册到了捕获阶段,也就是外面的p将先得到这个事件,然后才是内层的button。(以下例子请采用Firefox或chrome等非 ie浏览器测试)
<div id="out"> 
<div id="in"> 注册到捕获阶段,点击我查看效果</div>
</div> 
<script type="text/javascript">
       document.getElementById("out").addEventListener('click',
function(){alert('外面的div被点击!');}, true); 
document.getElementById("in").addEventListener('click',
function(){alert('里面的div被点击!');},true); 
</script> 

<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>

再放两个例子增加读者对捕获和冒泡的印象。
分享到:
评论

相关推荐

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

    本文将深入探讨JavaScript事件机制,特别是事件的捕获和冒泡阶段。 首先,理解JavaScript事件的基础概念至关重要。事件是用户或浏览器在与网页交互时发生的动作,比如点击按钮、页面加载或滚动等。当这些事件发生时...

    javascript 中事件冒泡和事件捕获机制的详解

    事件冒泡:自下而上的去触发事件—由内到外 绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获 true,事件捕获;false,事件冒泡 一般默认false,即事件冒泡 Jquery的e.stopPropagation会阻止冒泡,...

    【JavaScript源代码】javascript事件冒泡,事件捕获和事件委托详解.docx

    JavaScript中的事件处理是Web开发中的核心概念,主要涉及事件冒泡、事件捕获以及事件委托。这三种机制在处理用户交互和DOM元素之间的事件时起着至关重要的作用。 1. **事件冒泡**:事件冒泡是事件处理的默认模式,...

    javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结

    - 事件冒泡:事件从最具体的节点(事件目标)开始,向上逐级传播到最不具体的节点(文档)。例如,点击一个按钮,事件会先触发按钮的事件处理,然后依次触发其父元素,直到到达文档根节点。 - 事件捕获:与冒泡相反...

    Javascript事件流(事件捕获、事件冒泡),事件委托(代理)

    Javascript事件流(事件捕获、事件冒泡)–&gt;事件委托(代理) Javascript与HTML之间的交互是通过“事件”实现的。事件,就是文档或浏览器窗口发生的一些特定的交互瞬间,当我们与浏览器中的web页面进行特定的交互时...

    第三章 JavaScript事件

    了解 JavaScript 事件是非常重要的,掌握事件流、事件冒泡、事件捕获和 DOM 事件流,以及事件处理程序的知识点,可以帮助我们更好地理解和使用 JavaScript 事件,提高 WEB 程序员的开发效率和质量。

    JS中绑定事件顺序(事件冒泡与事件捕获区别)

    JavaScript中的事件处理机制是网页交互的核心,其中包括了两种主要的事件传播模式:事件冒泡(Bubbling)和事件捕获(Cropping)。事件冒泡是指事件从最深的节点开始,然后逐级向上传播到最外层的节点。而事件捕获则...

    JS冒泡事件与事件捕获实例详解

    冒泡事件和事件捕获是JavaScript中处理事件传播的两种主要模型,它们定义了事件在DOM树中传播的顺序。在实际的Web开发中,深入理解这两种模型对于正确处理事件,避免潜在的问题至关重要。 冒泡事件是指当一个事件在...

    JavaScript事件冒泡示例.html

    JavaScript事件冒泡是Web开发中的一个关键概念,它在网页交互和动态效果中扮演着重要角色。事件冒泡源于浏览器处理事件的...熟练掌握事件冒泡、事件捕获以及如何阻止冒泡,对于提升JavaScript的事件处理能力至关重要。

    【JavaScript源代码】JavaScript中事件冒泡机制示例详析.docx

    JavaScript中的事件冒泡机制是DOM事件处理的核心概念之一,它涉及到事件在DOM树中的传播方式。事件流主要有三种阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。 事件捕获阶段是从DOM树的根节点开始,沿着树向下...

    事件冒泡及捕获

    事件冒泡和事件捕获是两种不同的事件处理机制,它们决定了事件如何在DOM(Document Object Model)层次结构中传播。了解这两者对于优化事件处理性能和编写高效代码至关重要。 事件冒泡是从最具体的节点(通常是DOM...

    JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法

    在JavaScript中,事件流是描述事件如何在DOM(文档...总之,理解JavaScript中的事件冒泡和事件捕获对于编写高效、可靠的事件处理代码至关重要。正确使用这些机制可以帮助我们更好地控制事件处理流程,提升用户体验。

    【JavaScript源代码】基于事件冒泡、事件捕获和事件委托详解.docx

    在JavaScript中,事件处理是网页交互的核心部分,而事件冒泡、事件捕获和事件委托则是JavaScript事件模型中的三个重要概念。理解这三个概念对于优化网页性能和编写高效代码至关重要。 事件冒泡是指事件从最深的节点...

    事件冒泡解决方案

    在JavaScript的DOM编程中,事件冒泡是一个非常重要的概念,尤其在处理多级嵌套元素的事件时。事件冒泡是指事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上转播至最不具体的节点(文档...

    js事件机制----捕获与冒泡机制实例分析

    在JavaScript中,事件的传播分为两个阶段:捕获阶段和冒泡阶段。 **捕获阶段**(Capture Phase):当事件发生时,浏览器会从最外层的DOM节点(如`document`)开始,沿着DOM树向下传递事件,直到到达事件实际发生的...

    js事件监听机制(事件捕获)总结

    事件监听涉及的几个核心概念包括事件传播的两种方式:事件捕获和事件冒泡,以及兼容性问题和事件对象的使用。 首先,事件监听器可以通过多种方法添加,包括直接在HTML元素上使用内联属性如onclick,或通过...

    js基础之事件捕获与冒泡原理

    想要了解什么是事件捕获与冒泡,需要先了解什么是事件。 什么是事件? 我们知道,在前端开发中,JavaScript负责定义网页的“行为”。这里所说的“定义”,其实指的是开发者可以通过JavaScript语言向浏览器描述一些...

    【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)1

    本文将深入探讨JavaScript事件的捕获/冒泡阶段,DOM事件流,以及如何在实际应用中处理兼容性问题。 1. 事件捕获与冒泡阶段: - **事件捕获**:事件从最外层的document开始,向下逐级传递到最具体的元素(事件的...

Global site tag (gtag.js) - Google Analytics