JavaScript 现代事件模型与Event 对象

在 Internet Explorer 4(IE4,下同)和Netscape Navigator 4(NN4,下同)浏览器版本发布之前,事件一直遵循基本事件模型标准,但后者存在着如下的诸多缺陷:

基本事件模型只支持最基本的事件,事件的类型和数目很有限,同时处理事件的方式也非常有局限性;

在基本事件模型中,某事件发生后触发事件处理器进行相关操作的过程中缺少必要的一些信息,如事件发生的位置、发生事件的对象等,事件处理器只能很被动地响
应事件;

在基本事件模型中,没有任何途径解决对象继承关系中不同层次事件处理器之间的交互,对象的继承关系并没有反映到事件处理器的相互关系上。

基于此,在第4 代浏览器版本中,各大浏览器厂商都扩展了其基本事件模型,添加了新的事件及处理方式。它们与基本事件模型之间最大的区别在于新的事件模型增加了Event对象,该对象将事件发生的快照内容如事件发生的位置、触发的按键等传递给事件处理器,事件处理器根据事件提供的这些信息进行相应的操作,从而极大扩展了JavaScript 脚本的功能。

同时,新的事件模型中的事件可通过文本的继承关系进行事件传播,但各种浏览器中定义的事件流又不大不同,如IE4 和NN4 事件流的方向就完全相反:

在 IE4 中多数事件是由它们发生的地方开始向上回溯继承关系,上溯的事件在继承关系的每层都用合适的事件处理器来处理、改向或者将事件沿着关系树传递,当然,
某些定义清晰的事件如表单提交、按钮接收焦点等不会沿着继承关系上溯;

在 NN4 中事件从顶端对象开始至末端对象结束,并使得这些对象能够更改、处理或取消该事件,在较高层次上的事件处理器比低层次的事件处理器有更多机会处理
事件。

图显示了IE4 和NN4 新事件模型中事件流的不同:

除了事件传播方向上的不同外,IE4 和NN4 中定义的Event 对象也有很大的差异,主要表现在对象实例的传递、作用范围等方面。

JavaScript1.2 版本中引入Event 对象作为事件与事件处理器之间传递信息的桥梁,这些信息如事件发生的位置、触发事件的原始对象等通过Event 对象的属性提供。

IE4 和NN4 通过不同途径提供Event 对象的诸多属性供脚本开发人员调用。