Open qinyuanf opened 5 years ago
各种浏览器都支持
element.onclick = function () {}
未涉及事件级别的定义
增加两个方法用于处理指定和删除事件处理程序的操作:
addEventListener(事件名, 回调函数, 冒泡/捕获)
removeEventListener(事件名, 回调函数, 冒泡/捕获)
捕获为 true,冒泡为 false
element.addEventListener('click', function () {}, false)
新增了几个事件名,如 keyup
keyup
概念: 事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)
案例:
<!DOCTYPE html> <html> <head> <title>Event Demo</title> </head> <body> <div> Click Me </div> </body> </html>
若点击了 div 元素,那么 click 事件会按下列顺序传播
解析: click 事件首先在 div 元素上发生,然后沿着 dom 树向上传播,每一级节点上都会发生,直至传播到 document 对象,如图所示。
概念: 事件捕获的思想是不太具体的节点应该更早接收事件,而具体的元素应该最后接收事件。
若仍然以上面的代码作为案例,如果点击 div 元素,那么 click 事件会按下列顺序传播
解析: 在事件捕获的过程中,document 对象会首先接收到 click 事件,然后事件沿 dom 树一次往下,一直传播到事件的实际目标,即 div 元素。
代码示例
const dom = document.querySelector('#dom') /** * 事件捕获案例,冒泡反之即可 * 输出捕获顺序如下,即使监听时乱序 * 1. window * 2. document * 3. html * 4. body * 5. div */ // 监听 html document.documentElement.addEventListener('click', function () { console.log('捕获 html') }, true) // 监听 window window.addEventListener('click', function () { console.log('捕获 window') }, true) // 监听 body document.body.addEventListener('click', function () { console.log('捕获 body') }, true) // 监听 div dom.addEventListener('click', function () { console.log('捕获 div') }, true) // 监听 document document.addEventListener('click', function () { console.log('捕获 document') }, true)
DOM2 级事件规定的事件流包括三个阶段:
若捕获事件和冒泡事件都存在,首先发生的是捕获阶段,然后是目标阶段,最后才是冒泡阶段
addEventListener() 第三个参数为是否捕获:
IE8 及更早版本不支持 DOM 事件流
event || (event = window.event)
event.target || event.srcElement
event.preventDefault ? event.preventDefault() : (event.returnValue = false)
event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true)
// 创建事件 const event = new Event('custom') // 注册事件监听器 dom.addEventListener('custom', function () { console.log('触发了自定义事件') }) // 触发事件 dom.dispatchEvent(event)
DOM 事件
目录
基本概念(dom 事件的级别)
DOM0
各种浏览器都支持
DOM1(忽略)
未涉及事件级别的定义
DOM2
增加两个方法用于处理指定和删除事件处理程序的操作:
addEventListener(事件名, 回调函数, 冒泡/捕获)
removeEventListener(事件名, 回调函数, 冒泡/捕获)
捕获为 true,冒泡为 false
DOM3
新增了几个事件名,如
keyup
dom 事件模型
事件冒泡
概念: 事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)
案例:
若点击了 div 元素,那么 click 事件会按下列顺序传播
解析: click 事件首先在 div 元素上发生,然后沿着 dom 树向上传播,每一级节点上都会发生,直至传播到 document 对象,如图所示。
事件捕获
概念: 事件捕获的思想是不太具体的节点应该更早接收事件,而具体的元素应该最后接收事件。
若仍然以上面的代码作为案例,如果点击 div 元素,那么 click 事件会按下列顺序传播
解析: 在事件捕获的过程中,document 对象会首先接收到 click 事件,然后事件沿 dom 树一次往下,一直传播到事件的实际目标,即 div 元素。
代码示例
拓展:JS 获取 DOM 元素的方法
dom 事件流
概念
DOM2 级事件规定的事件流包括三个阶段:
说明
若捕获事件和冒泡事件都存在,首先发生的是捕获阶段,然后是目标阶段,最后才是冒泡阶段
addEventListener() 第三个参数为是否捕获:
IE8 及更早版本不支持 DOM 事件流
图解
什么是 event 对象及常见应用
DOM 中的事件对象
IE 中的事件对象
Event 的兼容写法
event || (event = window.event)
event.target || event.srcElement
event.preventDefault ? event.preventDefault() : (event.returnValue = false)
event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true)
自定义事件