DOM 0 ~ DOM 3 是 W3C 的标准事件模型。 IE 自立门户,有自己独特的事件模型
- DOM 0
DOM 0 不是 W3C 规范。而仅仅是对在 Netscape Navigator 3.0 和 Microsoft Internet Explorer 3.0 中的等价功能性的一种定义
- DOM 1
DOM 1 专注于 HTML 和 XML 文档模型。它含有文档导航和处理功能。
其实世上本来没有 DOM 0,叫的人多了就有了 DOM 0 级。 在1998 年 10 月 DOM1 级规范成为 W3C 的推荐标准。 在此之前的实现,我们就习惯称为 DOM 0 级,其实本是没有这个标准的。
- DOM 2
DOM 2 对DOM 1添加了样式表对象模型,并定义了操作附于文档之上的样式信息的功能性。 DOM 2 还定义一个事件模型(Events,规定了访问文档事件的 API),并提供了对 XML 命名空间的支持。
- DOM 3
DOM 3 规定了内容模型 (DTD 和 Schemas)和文档验证。DOM 3 同时规定了文档加载和保存、文档查看、文档格式化和关键事件
- IE 的事件模型
1. DOM 0
事件模型
绑定方式
DOM 0 的事件绑定有两种方式
- 在 html 元素上直接绑定事件
- 在 JS 中获取元素,为元素绑定上
onXXX事件阻止冒泡:
event.stopPropagation()阻止浏览器默认事件:event.preventDefault()事件源:event.target当前触发元素:event.currentTarget冒泡路径:event.path
// 方式一<div onClick="console.log('div1')"> </div><div onClick="fn"> </div><script>function fn() {console.log('div2')}</script>
// 方式二<div id="div"></div><script>document.getElementById('div').onclick = function() { console.log('xxx') }</script>
卸载绑定
在 JS 中,直接把元素的监听函数赋值 nullelement.onxxx = null
2. DOM 2
事件模型
DOM2 事件模型分为三个阶段:
- 捕获阶段
- 事件从
Document 对象沿着文档树向下传播给节点。 - 如果目标的任何一个祖先专门注册了事件监听函数,那么在事件传播的过程中就会运行这些函数。(
DOM 0事件模型处理没有捕获阶段)
- 事件从
- 目标阶段
- 下一个阶段发生在目标节点自身,直接注册在目标上的适合的事件监听函数将运行。(一般将此阶段看作冒泡阶段的一部分)
- 冒泡阶段:
- 在 JS 中获取元素,用
addEventListener为元素绑定事件 element.addEventListener(<eventName>, <eventFunction>,<isCapture>)在 JS 中获取元素,用
removeEventListener为元素卸载绑定事件
element.removeEventListener(<eventName>, <eventFunction>,<isCapture>)
3. DOM 3
DOM 3 事件规定了一下几种事件:
- UI 事件,当用户与页面上的元素交互时触发;
- 焦点事件,当元素获得或者失去焦点时触发;
- 鼠标事件,当用户通过鼠标在页面上执行操作时触发;
- 滚轮事件,当使用鼠标滚轮(或类似设备)时触发;
- 文本事件,当在文档中,输入文本时触发;
- 键盘事件,当用户通过键盘在页面上执行操作时触发;
- 合成事件,当为 IME(Input Method Editor,输入法编辑器)输入字符时触发;
- 变动事件,当底层 Dom 结构发生变化时触发;
DOM 3 还定义了自定义事件,自定义事件不是由 DOM 原生触发的,它的目的是让开发人员创建自己的事件。
通过const customEvent = document.createEvent("CustomEvent") 创建自定义事件。cutomEvent是一个对象,该对象原型上有一个方法initCustomEvent,方法接受四个参数
type<string>:,触发的事件类型,自定义。例如 “keyDown”,“selectedChange”;bubble<boolean>:事件是否可冒泡cancelLabel<boolean>:事件是否可取消detail<any>:保存在event对象的detail属性中 ```javascript // 自定义事件示例
<a name="v3kmr"></a># 4. IE 事件模型> 包括 IE9 在内的主流浏览器都支持 DOM 2级 事件,IE9 也支持 DOM 3级 事件<a name="KCKTH"></a>## 事件模型IE 事件模型只有目标阶段和冒泡阶段<a name="kIESl"></a>## 绑定方式IE 事件模型绑定只有一种方式- 在 JS 中获取元素,用 `attachEvent`为元素绑定事件- `element.attachEvent(on + <eventName>, <eventFunction>)`> 阻止冒泡:`event.cancelBubble`> 阻止默认事件:`event.returnValue = false````html<button id="btn">1<button><script>document.getElementById('btn').attachEvent('click', (event) => console.log(event))</script>
卸载绑定
element.detachEvent(on + <eventName>, <eventFunction>)
