JavaScript 事件处理

112 阅读1分钟

一、 stopPropagation()

用于停止事件的传播,阻止其向上或向下的传播。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            border: 1px solid red;
        }
    </style>
</head>

<body>
    <div id="outer">
        <div id="middle">
            <div id="inner"></div>
        </div>
    </div>

    <script>
        const outer = document.getElementById('outer');
        const middle = document.getElementById('middle');
        const inner = document.getElementById('inner');
        
        outer.addEventListener('click', () => {
            console.log('Outer clicked');
        },);
        middle.addEventListener('click', () => {
            console.log('Middle clicked');
        },);
        inner.addEventListener('click', (event) => {
            event.stopPropagation();
            console.log('Inner clicked');
        },);

    </script>
</body>

</html>

输出结果只有 Inner clicked .

二、 preventDefault()

用于阻止事件的默认行为。例如,在链接上使用该方法可以防止跳转到新页面。

<a href="https://www.baidu.com" id="link">Click me!</a>

<script>
  const link = document.getElementById('link');

  link.addEventListener('click', function(event) {
    event.preventDefault();
    console.log('Link clicked, but default behavior prevented');
  });
</script>

三、 stopImmediatePropagation()

与stopPropagation类似,但它能够立即停止事件的传播,并且阻止同一元素上其他事件处理函数的执行。

<button id="btn">Click me!</button>

<script>
  const btn = document.getElementById('btn');

  btn.addEventListener('click', function(event) {
    event.stopImmediatePropagation();
    console.log('Button clicked, propagation stopped');
  });

  btn.addEventListener('click', function(event) {
    console.log('Another event handler on the same element');
  });
</script>

在点击按钮时,第二个事件处理函数不会执行。输出结果只有 Button clicked, propagation stopped

四、 targetcurrentTarget

  • event.target:表示事件的实际目标,即触发事件的元素。
  • event.currentTarget:表示当前绑定事件的元素,即事件处理函数所附加的元素。
<div id="outer">
  <div id="inner">
    <button id="btn">Click me!</button>
  </div>
</div>

<script>
const outer = document.getElementById('outer');
const inner = document.getElementById('inner');
const btn = document.getElementById('btn');

outer.addEventListener('click', function(event) {
  console.log('Outer target:', event.target.id);
  console.log('Outer currentTarget:', event.currentTarget.id);
});

inner.addEventListener('click', function(event) {
  console.log('Inner target:', event.target.id);
  console.log('Inner currentTarget:', event.currentTarget.id);
});

btn.addEventListener('click', function(event) {
  console.log('Button target:', event.target.id);
  console.log('Button currentTarget:', event.currentTarget.id);
});
</script>

输出结果

Button target: btn
Button currentTarget: btn
Inner target: btn
Inner currentTarget: inner
Outer target: btn
Outer currentTarget: outer

五、事件委托

事件委托是一种常用的技术,可以在父元素上代理处理多个子元素的事件。这样可以减少事件处理函数的数量,提高性能。

<ul id="list">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
</ul>

<script>
  const list = document.getElementById('list');

  list.addEventListener('click', function(event) {
    if (event.target.tagName === 'LI') {
      console.log('Clicked on item:', event.target.textContent);
    }
  });
</script>

依次点击,输出结果为

Clicked on item: Item 1
Clicked on item: Item 2
Clicked on item: Item 3
Clicked on item: Item 4