DOM 事件

事件(Event)就是"浏览器里发生了某事":用户点击、按下键盘、鼠标移动、页面加载完成……JavaScript 监听这些事件并执行对应函数,网页才真正有了交互。事件机制是人机交互的入口,一切点击、输入、提交都靠它驱动。

常见事件一览

事件触发时机
click鼠标单击元素
dblclick双击元素
mouseover / mouseout鼠标移入 / 移出元素
keydown / keyup按下 / 松开键盘按键
change输入框、下拉框内容改变并失焦
submit提交表单
load页面或图片等资源加载完成

内联事件(on 属性)

最早的写法是把事件写成 HTML 属性,属性值是一段 JS:

<button onclick="alert('你点了我')">点我</button>

简单直观,但把 JS 与 HTML 混在一起难以维护,而且同一事件只能绑定一个处理函数。

addEventListener:推荐写法

用 addEventListener 在 JS 中注册监听,HTML 保持干净,且同一元素可绑定多个处理函数:

<button id="btn">点我</button>
<script>
  const btn = document.getElementById("btn");
  // 同一 click 事件绑定两个处理函数,点击时都会执行
  btn.addEventListener("click", () => console.log("第一次点击"));
  btn.addEventListener("click", () => console.log("第二次点击"));
</script>

点击按钮,控制台依次输出"第一次点击""第二次点击"。

事件对象 event

处理函数会自动收到一个事件对象,携带本次事件的详细信息:点了哪个元素(target)、事件类型、鼠标坐标、按键等:

<button id="btn">试试</button>
<script>
  document.getElementById("btn").addEventListener("click", function (e) {
    console.log("触发元素:" + e.target.tagName); // 输出:触发元素:BUTTON
    console.log("事件类型:" + e.type);            // 输出:事件类型:click
  });
</script>

两个常用方法:e.preventDefault() 阻止默认行为(如阻止链接跳转、表单提交);e.stopPropagation() 阻止事件继续向上冒泡。

事件流:捕获与冒泡

点击嵌套元素时,事件先由外向内"捕获"到目标,再从目标向外"冒泡"。默认在冒泡阶段触发处理函数;addEventListener 第三参传 true 可改为捕获阶段:

<div id="outer" style="padding:20px;background:#eee">
  <button id="inner">内层按钮</button>
</div>
<script>
  document.getElementById("outer").addEventListener("click",
    () => console.log("外层被点"), true); // 捕获阶段
  document.getElementById("inner").addEventListener("click",
    () => console.log("内层被点"));
</script>

点击按钮,先输出"外层被点"(捕获阶段外层先收到),再输出"内层被点"。

事件委托

利用冒泡,把多个子元素的事件统一交给父元素处理,这就是事件委托;动态新增的子元素无需重新绑定也能生效:

<ul id="list">
  <li>苹果</li><li>香蕉</li><li>橙子</li>
</ul>
<script>
  document.getElementById("list").addEventListener("click", function (e) {
    if (e.target.tagName === "LI") {
      console.log("你点了:" + e.target.textContent);
    }
  });
</script>

点击"香蕉",控制台输出:你点了:香蕉。

小结

事件让页面具备交互能力:addEventListener 负责监听,事件对象 e 提供细节,preventDefault/stopPropagation 控制默认行为与传播路径,事件委托提升性能并覆盖动态元素。掌握这四点,事件就能信手拈来。

笔记加载中…