一、addEventListener基本理解

addEventListener 是一个 JavaScript DOM 方法,用于向指定元素添加事件监听器。它接受三个参数:

  1. 事件类型:一个字符串,表示要监听的事件类型,如 ‘click’、‘mouseover’、‘keydown’ 等。
  2. 事件处理函数:当指定的事件发生时,会调用这个函数。这个函数接收一个参数,即触发事件的 Event 对象。
  3. 可选参数:这个参数可以是一个布尔值或一个对象。如果是布尔值,true 表示在捕获阶段调用事件处理函数,false 表示在冒泡阶段调用事件处理函数(默认)。如果是对象,可以包含以下属性:
    • capture :布尔值,表示是否在捕获阶段调用事件处理函数。
    • passive :布尔值,如果设置为 true,则表示事件处理函数不会调用 event.preventDefault()。这对于某些需要提高性能的滚动或触摸事件非常有用。
    • once :布尔值,如果设置为 true,则事件处理函数在第一次触发后就会被移除。(请注意,once 属性并非所有浏览器都支持,你需要检查你的目标浏览器是否支持这个属性。)
// 这是一个使用 addEventListener 的示例:
	document.querySelector('button').addEventListener('click', function(event) {
  		console.log('Button clicked!');
	}, false);
// 在这个示例中,我们向一个按钮元素添加了一个点击事件监听器。当按钮被点击时,控制台会打印出 "Button clicked!"。

二、注意项

  1. addEventListener 用于向指定元素添加事件监听器,而 removeEventListener 用于移除已添加的事件监听器。为了避免内存泄漏,我们通常在组件卸载或页面销毁时移除已添加的事件监听器。
  2. addEventListener 的第二个参数是事件处理函数。为了能够在后面通过 removeEventListener 移除事件监听器,事件处理函数不应该是匿名函数或箭头函数,因为它们每次都会创建一个新的函数实例,导致移除的不是同一个函数而无效。也就是说一个事件监听的 addEventListenerremoveEventListener 的第二个参数应该是同一个事件处理函数实例,所以尽量对处理函数使用命名函数,或者在React中使用 useRef 存储函数引用。
  3. removeEventListeneraddEventListener 里面的参数应该完全一样。如果 addEventListenerremoveEventListener 的参数不一样,那么 removeEventListener 可能无法正确地移除事件监听器。removeEventListener 需要知道具体的事件类型、事件处理函数以及是否在捕获阶段移除事件监听器,才能正确地移除事件监听器。如果这些参数与添加事件监听器时的参数不一致,那么 removeEventListener 将无法找到并移除事件监听器。例如,如果你在添加事件监听器时使用了捕获阶段,但在移除事件监听器时没有指定,那么事件监听器将不会被移除,因为默认情况下,removeEventListener 会在冒泡阶段移除事件监听器。

错误示例

const button = document.querySelector('button');

// 添加事件监听器
button.addEventListener('click', (event) => {
  console.log('Button clicked!', event);
});

// 尝试移除事件监听器(无效)
button.removeEventListener('click', (event) => {
  console.log('Button clicked!', event);
});

正确示例

const button = document.querySelector('button');

function handleClick(event) {
  console.log('Button clicked!', event);
}

// 添加事件监听器
button.addEventListener('click', handleClick);

// 移除事件监听器
button.removeEventListener('click', handleClick);

正确示例: 在React中使用命名函数

import React, { useEffect } from 'react';

const MyComponent = () => {
  useEffect(() => {
    const handleClick = (event) => {
      console.log('Button clicked!', event);
    };

    const button = document.querySelector('button');
    button.addEventListener('click', handleClick);

    return () => {
      button.removeEventListener('click', handleClick);
    };
  }, []);

  return <button>Click me</button>;
};

export default MyComponent;

正确示例: 在React中使用 useRef 存储函数引用

import React, { useEffect, useRef } from 'react';

const MyComponent = () => {
  const handleClickRef = useRef(null);

  useEffect(() => {
    handleClickRef.current = (event) => {
      console.log('Button clicked!', event);
    };

    const button = document.querySelector('button');
    button.addEventListener('click', handleClickRef.current);

    return () => {
      button.removeEventListener('click', handleClickRef.current);
    };
  }, []);

  return <button>Click me</button>;
};

export default MyComponent;
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐