彻底捋一捋JS事件:捕获与冒泡、事件处理程序、事件对象、跨浏览器、事件委托

JavaScript 事件是前端开发中重要的一环。理解 JavaScript 事件模型以及如何处理它们,是成为一个优秀前端开发人员必不可少的技能。本文将详细介绍 JS 事件相关的概念和知识点,并提供实例代码帮助读者更好地理解。

事件传播

当用户与网页交互时,会产生各种事件,如鼠标点击事件,键盘按下事件等。在 JavaScript 中,这些事件会一路向上冒泡到 DOM 树根节点,或者从根节点往下进行捕获。这种行为被称为事件传播(Event Propagation)。

冒泡

在事件冒泡阶段中,事件从最内层的 DOM 元素开始向外传递,直到到达包含元素(一般是 document 对象)。在这个过程中,父元素的监听器会在其自身之前先接收到事件。例如:

------
  ---- ---------
    ------- -------------- -----------
  ------
-------

如果我们给 box 和 body 标签都添加了 click 事件监听器,当用户点击 button 按钮时,事件首先会被 box 元素接收到,然后是 body 元素。

--- --- - -------------------------------
--- ---- - -----------------------------------------

----------------------------- ---------- -
  -------------------- ------
---

------------------------------ ---------- -
  -------------------- -------
---

输出结果:

------- ---
------- ----

捕获

在事件捕获阶段中,与冒泡相反,事件从最外层的元素开始向内传递,直到到达目标元素。在这个过程中,父元素的监听器会在其孩子之前先接收到事件。例如:

------
  ---- ---------
    ------- -------------- -----------
  ------
-------

如果我们给 box 和 body 标签都添加了 click 事件监听器,并设置了 capture 为 true,当用户点击 button 按钮时,事件首先会被 body 元素接收到,然后是 box 元素。

--- --- - -------------------------------
--- ---- - -----------------------------------------

------------------------------ ---------- -
  -------------------- -------
-- ------

----------------------------- ---------- -
  -------------------- ------
-- ------

输出结果:

------- ----
------- ---

事件处理程序

在 JavaScript 中,可以通过事件处理程序(Event Handlers)来响应特定的事件。事件处理程序可以被添加到任何 DOM 元素上,它们通常是一个 JavaScript 函数,用来处理指定事件的逻辑。例如:

------- -------------- -----------
--- --- - -------------------------------

----------- - ---------- -
  ------------- ----------
--

在这个例子中,我们给按钮添加了一个点击事件处理程序,当用户点击该按钮时,alert 弹窗会显示 "Button clicked"。

需要注意的是,使用 onclick 这种方式添加事件处理程序存在一些问题,比如无法同时添加多个事件处理程序,也无法移除指定事件处理程序。推荐使用 addEventListener() 方法来添加事件处理程序。

事件对象

当某个事件发生时,JavaScript 会自动生成一个事件对象(Event Object),其中包含有关该事件的详细信息。事件对象可以用来获取事件类型、目标元素等信息。例如:

------- -------------- -----------
--- --- - -------------------------------

---------------------------

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------