第2集DOM事件继承链
DOM事件继承链深度解析
问题1:DOM节点元素上的事件方法是继承链是什么样的?即事件方法从何而来?
在浏览器中,DOM元素的事件处理能力是通过原型链继承得来的。DOM节点元素的继承链如下:
HTMLElement → Element → Node → EventTarget → Object
继承链详解
- HTMLElement:特定HTML元素的接口(如HTMLDivElement、HTMLButtonElement等)
- Element:提供了元素的基本属性和方法
- Node:提供了节点的基本属性和方法
- EventTarget:提供了事件处理的核心方法
- Object:JavaScript中所有对象的基类
EventTarget接口
事件处理的核心方法来自于EventTarget接口,它提供了三个关键方法:
- addEventListener:添加事件监听器
- removeEventListener:移除事件监听器
- dispatchEvent:触发事件
例如,当我们在一个按钮上调用addEventListener
方法时,实际上是调用了从EventTarget继承来的方法:
1 | // 这个方法实际上是从EventTarget继承来的 |
验证继承链
我们可以通过以下代码验证DOM元素的继承链:
1 | const button = document.createElement('button'); |
问题2:event事件实例的方法是从谁那继承过来的,具体的继承链是什么样的?
当事件触发时,浏览器会创建一个事件对象(Event实例)并传递给事件处理函数。这个事件对象的继承链取决于事件类型,但基本结构如下:
具体事件类型(如MouseEvent、KeyboardEvent等)→ UIEvent → Event → Object
事件对象继承链详解
具体事件类型:
- MouseEvent:鼠标事件(click, mousedown等)
- KeyboardEvent:键盘事件(keydown, keyup等)
- InputEvent:输入事件
- FocusEvent:焦点事件(focus, blur等)
- TouchEvent:触摸事件
- 等等…
UIEvent:用户界面事件的基类
Event:所有事件的基类,提供了基本的事件属性和方法
Object:JavaScript中所有对象的基类
Event基类的核心方法和属性
Event基类提供了所有事件对象共有的方法和属性:
方法:
preventDefault()
:阻止默认行为stopPropagation()
:阻止事件冒泡stopImmediatePropagation()
:阻止事件冒泡并阻止当前元素上的其他事件处理程序
属性:
type
:事件类型target
:触发事件的元素currentTarget
:当前处理事件的元素bubbles
:指示事件是否冒泡cancelable
:指示事件是否可以取消timeStamp
:事件创建时的时间戳- 等等…
验证事件对象的继承链
我们可以通过以下代码验证事件对象的继承链:
1 | document.addEventListener("click", function(event) { |
不同事件类型的继承关系
MouseEvent
MouseEvent → UIEvent → Event → Object
MouseEvent特有的属性:clientX, clientY, screenX, screenY, button等
KeyboardEvent
KeyboardEvent → UIEvent → Event → Object
KeyboardEvent特有的属性:key, code, keyCode, altKey, ctrlKey, shiftKey等
TouchEvent
TouchEvent → UIEvent → Event → Object
TouchEvent特有的属性:touches, targetTouches, changedTouches等
总结
- DOM节点的事件方法来自于EventTarget接口,继承链为:
HTMLElement → Element → Node → EventTarget → Object
- 事件对象的方法和属性来自于Event基类及其子类,继承链为:
具体事件类型(MouseEvent等)→ UIEvent → Event → Object
理解这些继承关系有助于我们更深入地理解DOM事件系统的工作原理,以及如何更有效地使用和扩展事件功能。