JavaScript 事件机制详解

5 阅读1分钟

前言

在前端开发中,点击、输入、滚动、提交表单,这些都属于事件。
而 JavaScript 中的事件机制,也是必须掌握的基础内容。

本文主要讲:

  • 什么是事件
  • 事件绑定
  • 事件冒泡
  • 事件捕获
  • 阻止冒泡
  • 阻止默认行为
  • 事件委托

一、什么是事件?

事件就是浏览器或用户触发的某种行为,比如:

  • 点击click

  • 输入input

  • 提交submit

  • 鼠标移入mouseover


二、事件绑定

1)HTML 行内绑定

<button onclick="handleClick()">点击</button>

不推荐,维护性差。


2)DOM 属性绑定

button.onclick = function () {
  console.log('点击了');
};

3)addEventListener

button.addEventListener('click', function () {
  console.log('点击了');
});

更推荐,功能更强。


三、事件冒泡

事件冒泡指的是:

事件从目标元素开始,逐级向父元素传播。

<div id="parent">
  <button id="child">按钮</button>
</div>
parent.addEventListener('click', () => {
  console.log('parent');
});

child.addEventListener('click', () => {
  console.log('child');
});

点击按钮时输出:

child
parent

四、事件捕获

事件捕获和冒泡相反,是从外到内传播。

parent.addEventListener('click', () => {
  console.log('parent');
}, true);

child.addEventListener('click', () => {
  console.log('child');
}, true);

这里会先执行父元素,再执行子元素。


五、阻止冒泡

child.addEventListener('click', (e) => {
  e.stopPropagation();
  console.log('child');
});

这样点击子元素时,事件不会继续冒泡到父元素。


六、阻止默认行为

link.addEventListener('click', (e) => {
  e.preventDefault();
});

比如点击链接时阻止跳转。


七、事件委托

事件委托指的是:

把子元素的事件交给父元素统一处理。

ul.addEventListener('click', (e) => {
  if (e.target.tagName === 'LI') {
    console.log('点击了 li');
  }
});

优点:

  • 减少事件绑定数量
  • 适合动态添加的元素

八、总结

事件机制中最重要的几个点:

  • 事件绑定
  • 事件冒泡
  • 事件捕获
  • 阻止冒泡
  • 阻止默认行为
  • 事件委托