欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS--JavaScript事件处理基础、事件模型、事件流(冒泡型、捕获型、混合型)、绑定事件(静态绑定和动态绑定)、事件处理函数

程序员文章站 2022-06-16 09:40:58
...

JavaScript事件基础

JavaScript与用户之间的交互是通过事件驱动来实现的,事件驱动是面向对象程序设计的重要概念,其核心就是以消息为基础、以事件来驱动(message based, event driven)。当网页对象发生特定事件时,浏览器会自动生成一个事件对象(Event),事件对象通常会沿着DOM节点进行传播,知道被脚本捕获。如果为事件绑定响应程序(事件处理函数),浏览器就会调用该事件处理函数,执行其中的代码,完成预定任务。

事件模式

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

  • 基本事件模型
    也成为DOM 0 事件模型,是浏览器初期出现的一种比较简单的事件交互方式,主要通过事件属性,为指定标签绑定事件处理函数。由于这种交互方式应用比较广泛,获得了所有浏览器的支持,目前任然比较流行。但是这种模型对于HTML文档严重依赖,不利于JavaScript独立开发。

  • DOM事件模型
    由W3C制定,是目前标准的事件处理模型。所有符合标准的浏览器都支持该模型,IE怪异模式不支持。DOM事件模型包括DOM2事件模块和DOM3事件模块,DOM3事件模块为DOM2事件模块的升级版,略有完善,主要是新增了一些事情类型,以适应移动设备的开发需要,但大部分规范和用法保持一致。

  • IE事件流
    IE4.0 及其以上版本浏览器支持,与DOM事件模型相似,但用法不同

  • Netscape事件模型
    由Netscape4浏览器实现,在Netscape6中停止支持

事件流

事件流就是多个节点对象对同一种事件进行响应的先后顺序,主要包括3种类型。

  • 冒泡型:
    事件从最特定的目标向最不特定的目标(document对象)触发,也就是事件从下向上进行响应,这个传递过程被形象的称为冒泡

  • 捕获型:
    事件从最不特定的目标(document对象)开始触发,然后到最特定的目标,也就是事件从上向下进行响应

  • 混合型:
    W3C的DOM事件模型支持捕获型和冒泡型两种事件流,但是捕获型事件流先发生,然后才发生冒泡型事件流。两种事件流会触及DOM种的所有层级对象,从document对象开始,最后返回document对象结束。

根据事件流类型,可以把事件传播的整个过程分为3个阶段:

  • 捕获阶段:事件从document对象沿着文档树向下传播到目标节点,如果目标节点的任何一个上级节点注册了相同事件,那么事件在传播过程种就会首先在最接近顶部的上级节点执行,依次向下传播。
  • 目标阶段:注册在目标节点上的事件被执行
  • 冒泡阶段:事件从目标节点向上触发,如果上级节点注册了相同的事件,将会逐级响应,依次向上传播

绑定事件

在基本事件模型中,JavaScript支持两种绑定方式。

1. 静态绑定:
把JavaScript脚本作为属性值,直接赋予给事件属性

<button onclick="alert(‘你单击了一次!’);">按钮</button>

2. 动态绑定:
使用DOM对象的事件属性进行赋值。

<button id="btn">按钮</button>
<script>
	var button = document.getElementById("btn");
	button.onclick = function(){
		alert('你单击了一次!');
	}
</script>

事件处理函数

事件处理函数是一类特殊的函数,主要任务是实现事件处理,为异步调用,由事件触发进行响应。

事件处理函数一般没有明确的返回值,不过在特定事件中,用户可以利用事件处理函数的返回值影响程序的执行,如单击超链接时,禁止默认的跳转行为。

示例:为按钮对象绑定一个单击事件。在事件处理函数中,参数e为形参,响应事件之后,浏览器会把event对象传递给形参变量e,再把event对象作为一个实参进行传递,读取event对象包含的事件信息,在事件处理函数中输出当前源节点名称

<button id="btn">按钮</button>
<script>
var button = document.getElementById("btn");
button.onclick = function(){
	var e = e || window.event;
	document.write(e.srcElement ? e.srcElement : e.target);
}
</script>

注意:IE事件模型和DOM事件模型对于event对象的处理方式不同:

  • IE把event对象定义为window对象的一个属性
  • DOM事件模型把event定义为事件处理函数的默认参数