以下测试在非IE浏览器中进行(如Chrome和火狐,因为IE不支持事件捕获)
1.先分析下面代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <title>浏览器事件机制——阻止事件传播</title> <style> div#divGrandpa3 {padding:40px;background-color:#f00;} div#divFather3 {padding:40px;background-color:#0f0;} div#divSon3 {padding:40px;background-color:#00f;} </style> </head> <body> <div id="divGrandpa3" style="width:300px;height:200px;" onclick = "showGrandpa0();" > I am Grandpa <div id="divFather3" style="width:200px;height:120px;" > I am father <div id="divSon3" style="width:100px;height:40px;" > 点击我 I am son </div> </div> </div> <script> function showSon(e) {alert("I am son");} function showSon0(e) {alert("Dom0: I am son");} function showFather(e) { alert("I am father"); } function showFather0(e) {alert("Dom0: I am father");} function showGrandpa(e) { e.stopPropagation();//在捕获阶段,阻止事件 传播 alert("I am Grandpa"); } function showGrandpa0(e) {alert("Dom0: I am Grandpa");} //3.捕获阶段 和 冒泡阶段 都 执行事件处理函数, 只在非IE浏览器中有效 var grandpa3 = document.getElementById("divGrandpa3"); var father3 = document.getElementById("divFather3"); var son3 = document.getElementById("divSon3"); if(window.addEventListener) { grandpa3.addEventListener("click", showGrandpa, true); father3.addEventListener("click", showFather, true); son3.addEventListener("click", showSon, true); } else if (window.attachEvent) { grandpa2.attachEvent("onclick", showGrandpa); father2.attachEvent("onclick", showFather); son2.attachEvent("onclick", showSon); } </script> </body> </html>
上面代码中三句,分别注册了三个DOM2级别的事件处理函数,
grandpa3.addEventListener("click", showGrandpa, true);
father3.addEventListener("click", showFather, true);
son3.addEventListener("click", showSon, true);
其中,在showGrandpa中调用了
e.stopPropagation();//在捕获阶段,阻止事件 传播,
另外,<div id="divGrandpa3" style="width:300px;height:200px;" onclick = "showGrandpa0();" >
div标签中定义onclick = "showGrandpa0();"属性,定义一个DOM1级别的事件处理函数
这样,根据事件传播顺序:
a.事件捕捉阶段,事件对象沿着document一直传播到发生事件的那个对象(即文档的目标节点,比如id为son的div),这个过程叫事件捕获.
b.事件到达目标节点,如果目标节点指定了事件处理函数,则执行这个函数
当点击 son时,显示 I am Grandpa(事件捕获过程中),然后事件传播终止,调用结束.
当点击grandpa时,先显示 Dom0: I am Grandpa 然后再显示 I am Grandpa
这里不是应该先进行 捕获吗, 应该先执行 grandpa3.addEventListener("click", showGrandpa, true); 注册的函数吗?
2. 分析下面代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <title>浏览器事件机制——阻止事件传播</title> <style> div#divGrandpa3 {padding:40px;background-color:#f00;} div#divFather3 {padding:40px;background-color:#0f0;} div#divSon3 {padding:40px;background-color:#00f;} </style> </head> <body> <div id="divGrandpa3" style="width:300px;height:200px;" > I am Grandpa <div id="divFather3" style="width:200px;height:120px;" > I am father <div id="divSon3" style="width:100px;height:40px;" > 点击我 I am son </div> </div> </div> <script> function showSon(e) {alert("I am son");} function showSon0(e) {alert("Dom0: I am son");} function showFather(e) { alert("I am father"); } function showFather0(e) {alert("Dom0: I am father");} function showGrandpa(e) { e.stopPropagation();//在捕获阶段,阻止事件 传播 alert("I am Grandpa"); } function showGrandpa0(e) {alert("Dom0: I am Grandpa");} //3.捕获阶段 和 冒泡阶段 都 执行事件处理函数, 只在非IE浏览器中有效 var grandpa3 = document.getElementById("divGrandpa3"); var father3 = document.getElementById("divFather3"); var son3 = document.getElementById("divSon3"); if(window.addEventListener) { grandpa3.addEventListener("click", showGrandpa, true); father3.addEventListener("click", showFather, true); son3.addEventListener("click", showSon, true); grandpa3.onclick=showGrandpa0; } else if (window.attachEvent) { grandpa2.attachEvent("onclick", showGrandpa); father2.attachEvent("onclick", showFather); son2.attachEvent("onclick", showSon); } </script> </body> </html>
上面代码中四句:
grandpa3.addEventListener("click", showGrandpa, true);
father3.addEventListener("click", showFather, true);
son3.addEventListener("click", showSon, true);
grandpa3.onclick=showGrandpa0;
前三句添加了DOM2级别的时间处理程序,
第四句grandpa3.onclick=showGrandpa0;
这个相当于覆盖了上面的onclick = "showGrandpa0();"
即同时在html标签中定义onclick = "showGrandpa0();" 和 在代码中定义 grandpa3.onclick=showGrandpa0;
相当于只在代码中 定义 grandpa3.onclick=showGrandpa0;
但是不仅仅是简单的覆盖,这里执行的顺变得不一样了:
当点击 son时,显示 I am Grandpa(事件捕获过程中),然后事件传播终止,调用结束.
当点击grandpa时,先显示 I am Grandpa 然后再显示 Dom0: I am Grandpa
这又是什么情况?
3. 结论
1.虽然在 showGrandpa()函数中调用了e.stopPropagation();阻止事件传播,
但是使用onclick = "showGrandpa0();"方式注册的事件处理函数,会在事件捕获之前执行?
2. 在代码中使用grandpa3.onclick=showGrandpa0;方式注册的
事件处理函数会在事件到达目标节点时执行(上面情况2中,在点击grandpa时,可看成是在事件传播阻止之前,
事件已经到达目标节点,所以执行了showGrandpa0())?
推测: 在事件传播过程中,当事件到达目标节点后,
使用html标签中类似于onclick="showGrandpa0();"方式注册的事件处理函数先执行,
然后再执行 使用grandpa3.addEventListener("click", showGrandpa, true);方式注册的DOM2事件处理函数
如果在代码中使用,grandpa3.onclick=showGrandpa0;方式注册事件处理函数,
则会覆盖html标签中类似与onclick="showGrandpa0();"方式注册的事件处理函数,
并且 grandpa3.onclick=showGrandpa0;方式注册事件处理函数
会在 grandpa3.addEventListener("click", showGrandpa, true);方式注册的DOM2事件处理函数
执行过了之后再执行.
相关推荐
本文将深入探讨JavaScript事件机制,特别是事件的捕获和冒泡阶段。 首先,理解JavaScript事件的基础概念至关重要。事件是用户或浏览器在与网页交互时发生的动作,比如点击按钮、页面加载或滚动等。当这些事件发生时...
5. **总结**:事件冒泡和事件捕获是JavaScript事件模型的两个阶段,它们定义了事件如何在DOM树中传播。事件委托则是一种高效利用事件处理的策略,可以降低内存消耗,提高性能,尤其适用于动态添加或删除DOM元素的...
冒泡事件和事件捕获是JavaScript中处理事件传播的两种主要模型,它们定义了事件在DOM树中传播的顺序。在实际的Web开发中,深入理解这两种模型对于正确处理事件,避免潜在的问题至关重要。 冒泡事件是指当一个事件在...
了解事件冒泡后,我们还可以遇到事件捕获的概念,与事件冒泡相反,事件捕获是从根节点开始向下传播到目标元素。通常,事件捕获用于在事件到达目标元素之前进行预处理。可以通过在`addEventListener`的第三个参数传入...
JavaScript中的事件冒泡机制是DOM事件处理的核心概念之一,它涉及到事件在DOM树中的传播方式。事件流主要有三种阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。 事件捕获阶段是从DOM树的根节点开始,沿着树向下...
事件冒泡和事件捕获是两种不同的事件处理机制,它们决定了事件如何在DOM(Document Object Model)层次结构中传播。了解这两者对于优化事件处理性能和编写高效代码至关重要。 事件冒泡是从最具体的节点(通常是DOM...
在JavaScript中,事件处理是网页交互的核心部分,而事件冒泡、事件捕获和事件委托则是JavaScript事件模型中的三个重要概念。理解这三个概念对于优化网页性能和编写高效代码至关重要。 事件冒泡是指事件从最深的节点...
总之,JavaScript的事件处理是构建动态网页的重要手段,熟练掌握事件绑定、事件冒泡、事件捕获和事件执行顺序能帮助开发者编写更高效、更易于维护的代码。通过实践和不断学习,可以更深入地理解和运用这些概念。
JavaScript中的事件处理机制包括事件冒泡和事件捕获两种方式,这两种机制定义了事件在DOM树中的传播顺序。在编写前端代码时,理解这两种机制对于管理事件触发和执行顺序至关重要。 事件冒泡是指当一个元素上的事件...
JavaScript中的事件处理机制是网页交互的核心,其中包括了两种主要的事件传播模式:事件冒泡(Bubbling)和事件捕获(Cropping)。事件冒泡是指事件从最深的节点开始,然后逐级向上传播到最外层的节点。而事件捕获则...
在探讨JavaScript事件冒泡和事件捕获之前,我们首先要了解什么是事件流。事件流指的是当事件发生在DOM树中的元素上时,事件处理的顺序。为了有效地组织事件处理程序,不同的浏览器厂商提出了不同的事件处理机制:...
在JavaScript中,事件流是描述事件如何在DOM(文档...总之,理解JavaScript中的事件冒泡和事件捕获对于编写高效、可靠的事件处理代码至关重要。正确使用这些机制可以帮助我们更好地控制事件处理流程,提升用户体验。
在JavaScript的DOM编程中,事件冒泡是一个非常重要的概念,尤其在处理多级嵌套元素的事件时。事件冒泡是指事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上转播至最不具体的节点(文档...
3. **事件传播控制**:利用`event.stopPropagation()`或`event.stopImmediatePropagation()`来阻止事件冒泡或立即停止所有后续处理。 4. **跨窗口通信**:当需要与外部程序交互时,控件可能利用`window.postMessage`...
JavaScript中的事件冒泡和事件捕获是事件处理的重要概念,它们在DOM(文档对象模型)中定义了事件触发的顺序。事件冒泡和捕获是两种不同的事件传播机制,它们在不同浏览器的历史发展中曾导致兼容性问题,但现在已经...
依次输出:div、p4、事件处理程序的执行顺序在JavaScript中,事件处理程序的执行顺序取决于事件的传播方式(冒泡或捕获)以及它们是如何被添加到元素上的。如果同时使用了事件捕获和冒泡,那么捕获阶段的事件处理...
在JavaScript的事件处理中,事件冒泡和事件捕获是两个关键的概念,它们定义了事件在DOM(文档对象模型)中的传播方式。事件通常由用户交互触发,如点击按钮、鼠标移动等,当这些事件发生时,它们会在元素及其祖先...
事件传播包括三个阶段:捕获阶段、目标阶段和冒泡阶段。了解这三个阶段对于掌握如何阻止事件传播至关重要。 1. **捕获阶段**: 当事件发生时,它会从DOM树的根节点开始向下传递,直到到达事件的目标元素。在这个...
事件监听涉及的几个核心概念包括事件传播的两种方式:事件捕获和事件冒泡,以及兼容性问题和事件对象的使用。 首先,事件监听器可以通过多种方法添加,包括直接在HTML元素上使用内联属性如onclick,或通过...