对同一个事件添加多个处理程序有如下两种方法:
1、window.onload = function() {f(); f1(); f2(); ...}
2、if(window.addEventListener){ //firefox
window.addEventListener('load',f,false);
window.addEventListener('load',f1,false);
...
}else{ //ie
window.attachEvent('onload',f);
window.attachEvent('onload',f1);
...
}
说到 addEventListener 不得不说到事件流。当一个事件发生时,分为三个阶段:
- 捕获阶段 从根节点开始顺序而下,检测每个节点是否注册了事件处理程序。如果注册了事件处理程序,并且 useCapture 为 true,则调用该事件处理程序。(IE 中无此阶段。)
- 目标阶段 触发在目标对象本身注册的事件处理程序,也称正常事件派发阶段。
- 冒泡阶段 从目标节点到根节点,检测每个节点是否注册了事件处理程序,如果注册了事件处理程序,并且 useCapture 为 false,则调用该事件处理程序。
举例:
<div id="div1">
<div id="div2">
<div id="div3">
<div id="div4">
</div>
</div>
</div>
</div>
如果在 d3 上点击鼠标,事件流是这样的:
- 捕获阶段 在 div1 处检测是否有 useCapture 为 true 的事件处理程序,若有,则执行该程序,然后再同样地处理 div2。
- 目标阶段 在 div3 处,发现 div3 就是鼠标点击的节点,所以这里为目标阶段,若有事件处理程序,则执行该程序,这里不论 useCapture 为 true 还是 false。
- 冒泡阶段 在 div2 处检测是否有 useCapture 为 false 的事件处理程序,若有,则执行该程序,然后再同样地处理 div1。
注意,上述捕获阶段和冒泡阶段中,实际上 div1 之上还应该有结点,比如有 body,但这里不讨论。
addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click");第二个参数表示要接收事件处理的函数;第三个参数为 useCapture,本文就讲解它。
<div id="outDiv">
<div id="middleDiv">
<div id="inDiv">请在此点击鼠标。</div>
</div>
</div>
<div id="info"></div>
<script type="text/javascript">
var outDiv = document.getElementById("outDiv");
var middleDiv = document.getElementById("middleDiv");
var inDiv = document.getElementById("inDiv");
var info = document.getElementById("info");
outDiv.addEventListener("click", function () { info.innerHTML += "outDiv" + "<br>"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "<br>"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "<br>"; }, false);
</script>
上述是我们测试的代码,根据 info 的显示来确定触发的顺序,有三个 addEventListener,而 useCapture 可选值为 true 和 false,所以 2*2*2,可以得出 8 段不同的程序。
全为 false 时,触发顺序为:inDiv、middleDiv、outDiv;
全为 true 时,触发顺序为:outDiv、middleDiv、inDiv;
outDiv 为 true,其他为 false 时,触发顺序为:outDiv、inDiv、middleDiv;
middleDiv 为 true,其他为 false 时,触发顺序为:middleDiv、inDiv、outDiv;
……
最终得出如下结论:
- true 的触发顺序总是在 false 之前;
- 如果多个均为 true,则外层的触发先于内层;
- 如果多个均为 false,则内层的触发先于外层。
下面提供全部代码,您可以更改其中的 true、false 值,来进行测试。注意,不适用于 IE。
<?xml version="1.0" encoding="gb2312"?>
<!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">
<head>
<meta http-equiv="Content-Language" content="zh-cn" />
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>useCapture</title>
<style type="text/css">
#outDiv
{
padding:10px 10px 10px 10px;
border:1px solid red;
}
#middleDiv
{
padding:10px 10px 10px 10px;
border:1px solid green;
}
#inDiv
{
padding:10px 10px 10px 10px;
border:1px solid blue;
}
</style>
</head>
<body>
<div id="outDiv">
<div id="middleDiv">
<div id="inDiv">请在此点击鼠标。</div>
</div>
</div>
<div id="info"></div>
<script language="javascript" type="text/javascript">
<!--
var outDiv = document.getElementById("outDiv");
var middleDiv = document.getElementById("middleDiv");
var inDiv = document.getElementById("inDiv");
var info = document.getElementById("info");
outDiv.addEventListener("click", function () { info.innerHTML += "outDiv" + "<br>"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "<br>"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "<br>"; }, false);
//-->
</script>
</body>
</html>
分享到:
相关推荐
本教程"JavaScript实例讲解-洪恩在线"将深入浅出地介绍JavaScript的基础知识以及实际应用,帮助初学者快速上手。 在JavaScript的世界里,变量是数据的容器,可以通过var、let或const关键字来声明。例如,`var x = 5...
6. **优化与兼容**:为了保证在不同浏览器和设备上的良好效果,我们需要考虑JavaScript的兼容性问题,如使用`addEventListener`或`attachEvent`来兼容老版本IE浏览器的事件绑定。同时,对于移动设备,可能需要根据...
2. 事件处理程序:JavaScript通过addEventListener和removeEventListener来添加和移除事件监听器。 五、DOM操作 1. Document Object Model:JavaScript通过DOM接口操作HTML或XML文档结构,如获取元素、修改元素、...
在这个"ppk关于javascript事件的讲解"教程中,我们将深入探讨JavaScript事件处理机制及其应用。 首先,JavaScript事件是网页中发生的特定动作,比如鼠标点击、键盘输入、页面加载等。当这些动作发生时,JavaScript...
这套PPT教程通过24个章节的深入讲解,不仅覆盖了JavaScript的基础知识,还涉及到了许多实用的前端开发技能,包括与用户交互、数据持久化、动态效果、多媒体处理、图形绘制以及异步通信等,对于提升JavaScript编程...
书中详细讲解了事件冒泡、事件捕获以及如何使用addEventListener和removeEventListener方法来管理事件。 JavaScript的AJAX(异步JavaScript和XML)技术也是本书的重要部分,它使得网页可以在不刷新整个页面的情况下...
JavaScript是Web开发中不可或缺的一部分,尤其在用户交互和动态网页设计方面起着核心作用。本文将深入探讨JavaScript中的大事机制,包括大事流、大事处理方式以及大事对象。 首先,理解“大事”的概念至关重要。...
案例可能会展示如何使用addEventListener或attachEvent来添加事件监听器,以及如何处理事件触发时的回调函数。 7. **DOM操作** Document Object Model (DOM)是HTML和XML文档的编程接口。案例可能涉及元素的选择...
学会使用addEventListener和removeEventListener来添加和移除事件监听器。 5. **AJAX**:异步JavaScript和XML,用于在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容。了解XMLHttpRequest或fetch API的...
这份源代码集合包含了26个章节的详细内容,旨在全面讲解JavaScript的各种概念和技术,帮助开发者深入理解和掌握这门语言。 1. **从零开始**:这一章节通常会介绍JavaScript的基础知识,包括变量声明、数据类型(如...
本教程由传智播客的张孝祥老师讲解,主要涵盖了JavaScript的基础语法和核心概念。 1. 变量与数据类型: JavaScript支持多种数据类型,包括基本类型(如字符串、数字、布尔值、null和undefined)和引用类型(如对象...
本教案及案例旨在深入浅出地讲解JavaScript的基础知识和实战技巧,帮助学习者全面理解和掌握这一强大的工具。 一、JavaScript基础 1. 变量与数据类型:JavaScript支持多种数据类型,包括基本类型(Number、String...
视频可能涉及DOM元素的事件绑定(addEventListener、removeEventListener)和事件冒泡、捕获机制。 5. **AJAX**:异步JavaScript和XML(AJAX)允许页面在不刷新的情况下与服务器进行通信。视频可能讲解了...
在JavaScript中,可以使用addEventListener方法来添加事件监听器。例如,在页面加载完成后,我们可以为body元素添加一个'mousedown'事件监听器,当用户按下鼠标按钮时触发mouseDown函数: ```javascript window....
下面我们将深入探讨这个话题,讲解其背后的原理和实现方法。 首先,我们需要了解HTML5的Canvas元素。Canvas是HTML5引入的一个强大特性,它提供了一个二维绘图表面,开发者可以使用JavaScript来绘制图形,包括线条、...
手册中也会讲解如何使用浏览器的开发者工具进行JavaScript代码的调试,以及如何通过优化代码性能来提升用户体验,如减少DOM操作、缓存结果、避免全局查找等。 十、安全实践 最后,了解JavaScript的安全性至关重要,...
韩顺平老师的课程深入浅出地讲解了这些概念,并结合实例进行演示,有助于初学者快速掌握JavaScript的核心知识,进一步提升Web开发能力。通过学习这个课件,开发者可以更好地理解JavaScript的工作原理,从而在实际...
这个PPT教程很适合初学者,通过实例讲解,能帮助学习者更好地理解和应用JavaScript的这些基础知识,为构建动态网页和应用程序打下坚实的基础。在实际学习过程中,结合实践项目和不断探索,可以更快速地提升技能。
在描述中提到的“必备书籍”,暗示了它可能包含了这些基础知识的详细讲解。 在JavaScript中,函数是一等公民,可以作为参数传递,也可以作为返回值。函数表达式、箭头函数和闭包是JavaScript高级特性的体现,它们...
JavaScript是一种广泛应用于网页和网络应用的编程语言,尤其在客户端脚本方面发挥着核心..."JavaScript备课"的资料将是你探索这个精彩世界的起点,通过实例代码和逐步讲解,你将能够构建自己的Web应用并提升编程技能。