高洛峰2017-04-11 13:00:17
所有的HTMLElement
类, 以及Document
, Window
类都实现了EventTarget
接口, EventTarget
接口定义了一个方法来监听事件:
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
其中第一个参数为要监听在事件名称, 第二个参数为触发执行的函数指针, 第三个是要触发的阶段.
每个事件都要从最顶层Window
向下传播到Document
到target.parentNode
, 这一阶段称为CAPTURE
, 然后传播到target
, 这一阶段称为TARGET
, 再从target.parentNode
传播到Document
到Window
, 这一阶段称为BUBBLE
. 在任何一个阶段调用事件的stopPropagation
方法都会停止向后传播事件.
因此如果要监听页面的某个事件而不依赖于target
元素, 可以在window
或者document
上监听, 并且第三个参数useCapture
设置为true
.
对于keydown
事件, 触发事件的target
为当前的activeElement
, 如果一个元素不可以被focus
, 即tabIndex
属性小于0
, 则不可以触发keydown
事件(但是可以手动dispatchEvent).