JS的事件传播,以前完全不知道,今天学习了。
JS的事件(event)是向上传播的,会一直传到根元素。
比如(使用jquery语法):
$("div").click(function(event) {
alert("div clicked");
});
$("span").click(function(event) {
alert("span clicked");
});
span是div的子元素,在点击span的时候,span的click事件向上传播到div的onclick函数里,所以画面会先后弹出“span clicked"和“div clicked”。
如果不想让事件向上传播,有以下几种办法。
1.return false;
$("div").click(function(event) {
alert("div clicked");
});
$("span").click(function(event) {
alert("span clicked");
return false;
});
在span的事件函数里return false,就能阻止span的click事件传到div的onclick函数。
2.调用event.target进行判断
$("div").click(function(event) {
if (event.target == this)
alert("div clicked");
});
$("span").click(function(event) {
alert("span clicked");
return false;
});
event.target是事件发生源的DOM元素。在span的onclick函数里,event.target和this一样,都是span元素;而在div的onclick函数里,event.target是span元素,this是div元素。
3.event.stopPropagation();
$("div").click(function(event) {
alert("div clicked");
});
$("span").click(function(event) {
alert("span clicked");
event.stopPropagation();
});
在子元素的事件函数里调用event.stopPropagation();。
注意:虽然event.target和event.stopPropagation()是纯DOM API,但不是被所有浏览器实现了的。jquery对这两个API做了统一,所有浏览器中都能使用。
当然,事件向上传播也有他的作用。
比如一个需要highlight的例子,有一个按钮区(DIV),里面有很多个按钮(BUTTON),这些元素都是白色。当鼠标移动到DIV时,DIV需要显示成浅灰色,BUTTON们还是白色,接着再移到BUTTON上时,DIV保持浅灰色,BUTTON要变成深灰色。
实现方式是给DIV和每个BUTTON都注册一对onmouseover/onmouseout事件函数,鼠标从按外进入DIV内时,触发DIV的onmouseover,DIV变灰,鼠标再移到DIV内某个BUTTON上时,触发DIV的onmouseout,DIV恢复成白色,这时BUTTON触发了onmouseover而变深灰,而且这个mouseover的event向上传播到了DIV触发了DIV的onmouseover,DIV又变灰,效果就是,当鼠标从DIV移到BUTTON上进,DIV保持灰色。假想一下,如果这个时候DIV没有保持灰色而变回了白色,效果就会很怪。也就是说,这个时候就需要事件上传机制把BUTTON这个子元素的mouseover event上传给DIV。
再举个例子,一个table有1000个row,每个row都要注册一个onclick函数,为每个row注册事件函数写起来容易,但由于循环多和有太多的函数需要内存管理,效率会下降。这个时候就可以写一个单一的事件函数,处理row的父元素,所有row的click event都会向上传播到这个事件函数里来接受处理。1000个事件函数需要注册和管理,现在变成一个,效率自然提升很多。
分享到:
相关推荐
JavaScript防止事件传播是一种常见的前端开发技术,用于控制事件在DOM(文档对象模型)层次中的传播方式。事件传播包括三个阶段:捕获阶段、目标阶段和冒泡阶段。了解这三个阶段对于掌握如何阻止事件传播至关重要。 ...
事件冒泡是指事件从最深的节点开始,逐级向上层节点传播事件。事件捕获则是从最外层节点开始向下传播。在DOM2级事件模型中,可以设置`useCapture`参数决定事件处理顺序。 五、事件对象 每个事件触发时都会创建一个...
JavaScript 事件的传播机制是理解JavaScript事件处理的关键概念之一,它描述了事件如何从文档的根元素逐层向下传递到事件触发的特定元素,以及如何返回。事件的传播分为三个阶段:捕获阶段、目标阶段和冒泡阶段。 1...
事件冒泡是指事件会从最深的节点开始,然后逐级向上层节点传播事件。事件捕获则相反,从最外层节点开始,向下层节点传递。可以通过设置`addEventListener`的第三个参数来选择事件处理模式。 此外,还有一些高级事件...
实验报告详细介绍了JavaScript事件处理的相关知识,这在Web开发中是非常关键的一部分,因为事件是用户与网页交互的主要方式。以下是对各个知识点的详细说明: 1. **JavaScript事件基本概念**: - **事件**:是用户...
JavaScript中的事件处理是Web开发中的核心概念,它涉及到事件的传播、取消默认行为以及阻止事件传播等关键点。本文将详细解析这些概念。 首先,**事件处理程序的返回值**在JavaScript中扮演着一个特殊的角色。当...
事件监听涉及的几个核心概念包括事件传播的两种方式:事件捕获和事件冒泡,以及兼容性问题和事件对象的使用。 首先,事件监听器可以通过多种方法添加,包括直接在HTML元素上使用内联属性如onclick,或通过...
JavaScript事件的传播是DOM元素处理事件的一种机制,它包括了捕获阶段、目标阶段和冒泡阶段。在本文中,我们将深入探讨这三个阶段,并通过一个实际的HTML示例来理解它们的工作原理。 首先,让我们来看捕获阶段。在...
JavaScript(简称JS)是网页开发中的重要脚本语言,它为网页添加了动态交互功能。在JS中,事件是用户或浏览器与网页交互时发生的特定情况。本资料包"JS事件汇总"着重于JS的事件处理,特别是鼠标事件,旨在为网页...
事件冒泡是指事件从最深的节点开始,逐级向上层节点传播事件。而事件捕获则相反,从最外层节点开始向下传播,直到到达目标节点。在DOM2级事件处理中,可以通过`addEventListener`的第三个参数决定事件处理方式。 四...
JavaScript 事件模型是Web开发中的核心概念,它定义了如何处理和响应用户或浏览器的交互。ECMAScript规范中的ECMA-357是与事件处理相关的一部分,它提供了JavaScript中处理事件的标准。 事件流是JavaScript事件模型...
- stopPropagation():阻止事件继续在DOM树中传播。 - preventDefault():阻止事件的默认行为,例如链接的跳转。 - clientX/clientY:相对于浏览器视口左上角的鼠标坐标。 - pageX/pageY:相对于整个文档的鼠标...
在JavaScript代码模块中,事件处理是一个核心概念,涉及到事件触发、事件监听和事件传播等多个方面。本篇将深入探讨JavaScript事件综合查询的相关知识点。 一、事件模型 1. DOM(Document Object Model)事件模型...
总结来说,"javascript事件查询综合"这个文档很可能详细介绍了JavaScript事件处理的各个方面,包括事件绑定、事件对象、事件传播机制、事件处理的控制以及高级话题如事件委托和现代事件API。理解和熟练运用这些知识...
JavaScript是Web开发中不可或缺的一部分,尤其在处理用户交互方面,事件和事件响应起着至关重要的作用。本篇文章将深入探讨JavaScript中的事件模型、事件处理方式以及常见事件类型,旨在帮助开发者更好地理解和应用...
JavaScript中的事件冒泡是事件处理的一个重要概念,它是指事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上转播至最不具体的节点(文档)的过程。这个机制允许事件在事件流的每个阶段都...
在这个"10-JS事件基础"的教程中,我们将深入理解JavaScript中的事件处理机制,包括事件对象、事件冒泡、DOM事件流以及鼠标和键盘事件。 首先,让我们了解一下什么是事件对象。在JavaScript中,每当发生一个事件(如...
事件冒泡是指事件从最内层元素向上层元素传播,使得祖先元素也能接收到相同的事件。这在很多情况下是有益的,但有时也需要阻止冒泡,如使用`event.cancelBubble = true`来实现。 五、事件委托(Delegation) 事件...
3. **取消事件冒泡**:通过调用事件对象上的`stopPropagation()`方法可以阻止事件继续传播到父节点,从而避免了因事件冒泡导致的多个事件监听器同时触发的问题。 4. **取消默认行为**:使用`preventDefault()`方法...