JavaScript 中的事件模型是一种用于处理用户交互和其他类型事件的机制。它允许开发人员对特定事件做出响应,并执行相应的代码。
事件
JavaScript 的事件模型基于事件驱动编程的概念,它包括以下主要组成部分:
-
事件目标(Event Target) :事件目标是触发事件的对象,它可以是文档、窗口、HTML 元素或其他 JavaScript 对象。每个事件目标都可以监听和触发事件。 -
事件监听器(Event Listener) :事件监听器是一个函数,用于定义事件发生时要执行的代码。通过将事件监听器附加到事件目标上,可以告诉 JavaScript 在事件发生时调用特定的函数。 -
事件类型(Event Type) :事件类型是一种特定的事件,例如点击事件(click)、键盘按下事件(keydown)、鼠标移动事件(mousemove)等。每个事件类型都有其特定的属性和行为。 -
事件处理程序(Event Handler) :事件处理程序是一个函数,它被分配给特定事件类型的监听器。当事件发生时,事件处理程序会被调用,并执行相关的代码。 -
事件对象(Event Object) :事件对象是一个包含有关事件的信息的对象。它提供了与事件相关的属性和方法,可以用于获取事件的详细信息,如事件目标、事件类型、鼠标位置等。
事件模型的基本流程如下:
-
选择要监听事件的目标对象。 -
定义事件监听器或事件处理程序函数。 -
将事件监听器附加到目标对象的特定事件类型上。 -
当事件发生时,事件目标将触发相应的事件,并调用相应的事件处理程序函数。 -
在事件处理程序函数中执行所需的操作。
JavaScript 提供了多种方式来操作事件模型,包括使用原生的 addEventListener
方法来添加事件监听器、使用内联事件处理程序、使用事件委托等。
事件流
由于 DOM 是一个树结构,如果在父子节点绑定事件时候,当触发子节点的时候,就存在一个顺序问题,这就涉及到了事件流的概念。
所谓事件流,Event Flow,是指描述事件在 DOM 树中传播和触发的顺序。当事件发生时,它会在 DOM 树的不同节点间传播,最终触发相应的事件处理程序。
事件流有两种主要的模型:
-
冒泡(Bubbling):在冒泡模型中,事件首先在触发事件的元素上触发,然后沿着 DOM 树向上冒泡,依次触发父元素的相同事件。换句话说,事件开始时在最具体的元素上触发,然后逐步向上触发,直到到达最顶层的祖先元素。这是默认的事件流模型,也是最常用的模型。 -
捕获(Capturing):在捕获模型中,事件从最顶层的祖先元素开始,沿着 DOM 树向下传播,直到达到触发事件的元素。然后,事件在触发元素上触发,最后不再继续传播。捕获模型在实际开发中较少使用,但可以使用 addEventListener 方法的第三个参数设置为 true 来启用捕获阶段。
事件流都会经历三个阶段:
-
事件捕获阶段(capture phase) -
处于目标阶段(target phase) -
事件冒泡阶段(bubbling phase)
在addEventListener
方法中,可以使用第三个参数来区分捕获阶段和冒泡阶段。该参数称为useCapture
,它是一个布尔值,默认为false
(冒泡阶段)。

如果将useCapture
设置为true
,则事件将在捕获阶段进行处理。

事件模型
事件模型可以分为三种:
-
原始事件模型(DOM0级) -
标准事件模型(DOM2级) -
IE事件模型(基本不用)
原始事件模型
事件绑定监听函数比较简单, 有两种方式:
-
HTML代码中直接绑定

-
通过JS代码绑定

特性
-
绑定速度快,DOM0 级事件具有很好的跨浏览器优势,会以最快的速度绑定,但由于绑定速度太快,可能页面还未完全加载出来,以至于事件可能无法正常运行。
-
只支持冒泡,不支持捕获 -
同一个类型的事件只能绑定一次。当希望为同一个元素绑定多个同类型事件的时候,是不被允许的,后绑定的事件会覆盖之前的事件。
删除 DOM0 级事件处理程序只要将对应事件属性置为null
即可。
标准事件模型
在该事件模型中,一次事件共有三个过程,也就是上文提到的事件流 3 阶段,
-
事件捕获阶段:事件从 Document 一直向下传播到目标元素, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行 -
事件处理阶段:事件到达目标元素, 触发目标元素的监听函数 -
事件冒泡阶段:事件从目标元素冒泡到 Document,依次检查经过的节点是否绑定了事件监听函数,如果有则执行
事件绑定监听函数的方式如下:

事件移除监听函数的方式如下:

举个栗子

IE事件模型
IE事件模型共有两个过程:
-
事件处理阶段:事件到达目标元素, 触发目标元素的监听函数。 -
事件冒泡阶段:事件从目标元素冒泡到document, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行
原文始发于微信公众号(前端一起学):JS基础知识–事件,事件流,事件模型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/191224.html