认识JavaScript事件

课后整理 2020-12-20

下面简单介绍JavaScript事件的基本概念。

JavaScript事件发展历史

最早在IE 3.0和Netscape 2.0浏览器中出现事件。互联网初期网速是非常慢的,为了解决用户漫长的等待,开发人员把服务器端处理的任务部分前移到客户端,让客户端JavaScript脚本代替解决。

例如,对用户输入的表单信息进行验证等,于是就出现各种响应用户行为的事件,如表单提交事件、文本输入时键盘事件、文本框中文本发生变化触发的事件、选择下拉菜单时引发的事件等。因此,早期的事件多集中在表单应用上。

DOM 2规范开始尝试标准化DOM事件,直到2004年发布DOM 3.0时,W3C才完善事件模型。IE9、Fircfox、Opera、Safari和Chrome主流浏览器都已经实现了DOM 2事件模块的核心部分。IE8及其早期版本使用IE私有的事件模型。

JavaScript是以事件驱动实现页面交互,事件驱动的核心:以消息为基础,以事件来驱动。通俗说,事件就是文档或浏览器窗口中发生的一些特定交互行为,如加载、单击、输入、选择等。可以使用侦听器预订事件,即在特定事情上绑定事件监听函数,以便在事件发生时执行相应的代码。当事件发生时,浏览器会自动生成事件对象(event),并沿着DOM节点有序进行传播,直到被脚本捕获。这种观察员模式确保JavaScript与HTML保持松散的耦合。

事件模型

在浏览器发展历史中,出现4种事件处理模型。

事件传播

当一个事件发生以后,它会在不同的DOM节点之间传播,也称为事件流。这种传播分成三个阶段,具体说明如下。

事件传播的最上层对象是window,接着依次是document,html(document.documentElement)和body(document.dody)。也就是说,如果<body>元素中有一个<div>元素,点击该元素。事件的传播顺序,在捕获阶段依次为window、document、html、body、div,在冒泡阶段依次为div、body、html、document、window。

事件类型

根据触发对象不同,可以将浏览器中发生的事件分成不同的类型。DOM 0事件定义了以下事件类型:

在DOM 2事件模型中,事件模块包含4个子模块,每个子模块提供对某类事件的支持。例如,MouseEvent子模块提供了对mousedown、mouseup、mouseover、mouseout和click事件类型的支持。包括IE 9在内的所有主流浏览器都支持DOM 2事件类型。

HTMLEvents和MouseEvents模块定义的事件类型与基础事件模型中的事件类型相似,UIEvents模块定义的事件类型与HTML表单元素的支持的获得焦点、失去焦点和单击事件功能类似,MutationEvents模块定义的事件是在文档改变时生成的,一般不常用。