这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
JavaScript 与 HTML 的交互是通过事件实现的,事件代表文档或浏览器窗口中某个有意义的时刻(用户或浏览器执行了某种动作)。可以使用仅在事件发生时执行的监听器(也叫处理程序)来订阅事件。这个模型叫 “观察者模式”,其能够做到页面行为(在 JavaScript 中定义)与页面展示(在 HTML 和 CSS 中定义) 的分离。
事件流
事件流描述的是从页面中接收事件的顺序。IE 的事件流是事件冒泡流,Netscape Communicator 的事件流是事件捕获流。
事件冒泡
事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。
<body>
<div></div>
</body>
如果点击了 <div> 元素,那么 click 事件传播顺序是:
div > body > html > document
事件捕获
事件捕获(event capturing),即事件是由不太具体的节点更早接收到,最具体的节点最后才接收到。
以事件冒泡的例子,click 事件触发顺序是:document > html > body > div
DOM 事件流
“DOM2级事件” 的事件流包含:事件捕获阶段、处于目标阶段和事件冒泡阶段。首先是事件捕获,然后是实际的目标接收到事件,最后是冒泡阶段。
事件处理程序
事件处理程序或事件侦听器是响应某个事件的函数。
HTML 事件处理程序
<input type="button" value="点我" onclick="console.log('已点击')" />
DOM0 级事件处理程序
每个元素都有自己的事件处理程序属性,如:
var btn = document.getElementById("myBtn");
btn.onclick = function() {
console.log("clicked");
};
DOM0 级指定的事件处理程序是元素的方法,这时候的事件处理程序实在元素的作用域运行的;即程序中的 this 引用当前元素。
var btn = document.getElementById("myBtn");
btn.onclick = function() {
console.log(this.id);
};
删除 DOM0 级事件处理程序:
btn.onclick = null;
DOM2 级事件处理程序
DOM2 级事件定义了指定和删除事件处理程序的操作:addEventListener()、removeEventListener();
参数说明:
- 要处理的事件名;
- 事件处理程序的函数;
- 布尔值,true:表示在捕获阶段调用事件处理程序,false:表示在冒泡阶段调用事件处理程序;
var btn = document.getElementById("myBtn");
btn.addEventListener("click", function() {
console.log(this.id);
}, false)
移除事件:
btn.removeEventListener("click", function() { // 无效
console.log(this.id);
}, false)
虽然第二个参数事件处理程序的函数看似相同,但是二者完全不同的函数。
// 有效
var handler = function () {
console.log(this.id);
};
btn.addEventListener("click", handler, false);
btn.removeEventListener("click", handler, false);