事件监听器
灵感胜于汗水 Lv5

addEventListener

EventTarget.addEventListener() 方法将指定的监听器注册到 EventTarget 上,当该对象触发指定的事件时,指定的回调函数就会被执行。事件目标可以是一个文档上的元素 ElementDocumentWindow,也可以是任何支持事件的对象(比如 XMLHttpRequest)。

addEventListener() 的工作原理是将实现 EventListener 的函数或对象添加到调用它的 EventTarget 上的指定事件类型的事件侦听器列表中。如果要绑定的函数或对象已经被添加到列表中,该函数或对象不会被再次添加。

使用

1
2
3
4
addEventListener(type, listener);
addEventListener(type, listener, options);
addEventListener(type, listener, useCapture);
// 返回值为undefined

参数

  • type

    表示监听事件类型的大小写敏感的字符串。

  • listener

    • : 当所监听的事件类型触发时,会接收到一个事件通知(实现了 Event 接口的对象)对象。listener 必须是一个实现了 EventListener 接口的对象,或者是一个函数。
  • options

    一个指定有关listener属性的可选参数对象。可用的选项如下:

    • capture (可选)

      一个布尔值,表示 listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。

    • once (可选)

      一个布尔值,表示 listener 在添加之后最多只调用一次。如果为 truelistener 会在其被调用之后自动移除。

    • passive (可选)

      一个布尔值,设置为 true 时,表示 listener 永远不会调用 preventDefault()。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。

    • signal (可选)

      AbortSignal,该 AbortSignalabort() 方法被调用时,监听器会被移除。

  • useCapture

    一个布尔值,表示在 DOM 树中注册了 listener 的元素,是否要先于它下面的 EventTarget 调用该 listener。当 useCapture(设为 true)时,沿着 DOM 树向上冒泡的事件不会触发 listener。当一个元素嵌套了另一个元素,并且两个元素都对同一事件注册了一个处理函数时,所发生的事件冒泡和事件捕获是两种不同的事件传播方式。事件传播模式决定了元素以哪个顺序接收事件。如果没有指定,useCapture 默认为 false

removeEventListener

EventTargetremoveEventListener() 方法可以删除使用 EventTarget.addEventListener() 方法添加的事件。可以使用事件类型,事件侦听器函数本身,以及可能影响匹配过程的各种可选择的选项的组合来标识要删除的事件侦听器。

调用 removeEventListener() 时,若传入的参数不能用于确定当前注册过的任何一个事件监听器,该函数不会起任何作用。

使用:

1
2
3
removeEventListener(type, listener);
removeEventListener(type, listener, options);
removeEventListener(type, listener, useCapture);
  • type

一个字符串,表示需要移除的事件类型。

  • listener

需要从目标事件移除的事件监听器函数。

  • options (可选)

    一个指定事件侦听器特征的可选对象。可选项有:

    • capture: 一个布尔值,指定需要移除的事件监听器函数是否为捕获监听器。如果未指定此参数,默认值为 false
  • useCapture (可选)

一个布尔值,指定需要移除的事件监听器函数是否为捕获监听器。如果未指定此参数,默认值为 false

例子1:

1
2
3
element.addEventListener("mousedown", handleMouseDown, true);
element.removeEventListener("mousedown", handleMouseDown, false); // 失败
element.removeEventListener("mousedown", handleMouseDown, true); // 成功

第一个调用失败是因为 useCapture 没有匹配。第二个调用成功,是因为 useCapture 匹配相同。

例子2:

1
element.addEventListener("mousedown", handleMouseDown, { passive: true });

这里,我们在 options 对象里将 passive 设成 true,其他 options 配置都是默认值 false

现在我们看下下面的 removeEventListener()。当配置 captureuseCapturetrue 时,移除事件失败;其他所有都是成功的。这说明只有 capture 配置影响 removeEventListener()。js

1
2
3
4
5
6
element.removeEventListener("mousedown", handleMouseDown, { passive: true });     // 成功
element.removeEventListener("mousedown", handleMouseDown, { capture: false }); // 成功
element.removeEventListener("mousedown", handleMouseDown, { capture: true }); // 失败
element.removeEventListener("mousedown", handleMouseDown, { passive: false }); // 成功
element.removeEventListener("mousedown", handleMouseDown, false); // 成功
element.removeEventListener("mousedown", handleMouseDown, true); // 失败
  • 本文标题:事件监听器
  • 本文作者:灵感胜于汗水
  • 创建时间:2022-10-24 18:50:48
  • 本文链接:https://cjhsyc.github.io/2022/10/24/事件监听器/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!