首页 / HTML5 入门教程 / 常见事件类型详解

HTML5 入门教程

常见事件类型详解

本教程共 110 篇 · 第 104 篇 · 更新于 2026-07-28 · 约 5 分钟阅读

HTML5HTML5 入门教程鼠标事件键盘事件表单事件窗口事件触摸事件

104. 常见事件类型详解

本节目标:掌握鼠标、键盘、表单、窗口等常用事件的用法和区别,能在实际场景中正确选择和组合事件。

鼠标事件

click vs mousedown vs mouseup

// click = mousedown + mouseup(同一个元素上)
element.addEventListener("mousedown", function () {
  console.log("按下了");
});
element.addEventListener("mouseup", function () {
  console.log("松开了");
});
element.addEventListener("click", function () {
  console.log("一次点击完成");
});

mouseenter vs mouseover

// mouseenter:不冒泡,只在进入元素本身时触发
element.addEventListener("mouseenter", function () {
  console.log("进入元素");
});

// mouseover:冒泡,进入子元素也会触发
element.addEventListener("mouseover", function () {
  console.log("鼠标在上面");
});
Tip

mouseenter / mouseleave 更省心,不会因子元素触发多余事件。

contextmenu:右键菜单

element.addEventListener("contextmenu", function (e) {
  e.preventDefault(); // 阻止默认右键菜单
  // 显示自定义菜单
});

鼠标位置

element.addEventListener("click", function (e) {
  console.log("视口坐标:", e.clientX, e.clientY);
  console.log("页面坐标:", e.pageX, e.pageY);
  console.log("屏幕坐标:", e.screenX, e.screenY);
});
  • clientX/Y:相对于浏览器视口
  • pageX/Y:相对于整个页面(含滚动距离)
  • screenX/Y:相对于显示器屏幕

键盘事件

三个事件的触发顺序

按下按键时顺序是:keydownkeypresskeyup

input.addEventListener("keydown", function (e) {
  console.log("按下了:", e.key);
});

input.addEventListener("keyup", function (e) {
  console.log("松开了:", e.key);
});
Note

keypress 已被废弃,不要再用。监听 keydown 即可。

常用键值

document.addEventListener("keydown", function (e) {
  if (e.key === "Enter") console.log("回车");
  if (e.key === "Escape") console.log("ESC");
  if (e.key === "Tab") console.log("Tab");
  if (e.key === " ") console.log("空格");
});

组合键

document.addEventListener("keydown", function (e) {
  if (e.ctrlKey && e.key === "s") {
    e.preventDefault(); // 阻止浏览器保存
    console.log("自定义保存");
  }
  if (e.shiftKey && e.key === "A") {
    console.log("Shift+A");
  }
  if (e.altKey && e.key === "F4") {
    console.log("Alt+F4");
  }
  if (e.metaKey && e.key === "z") {
    console.log("Cmd/Ctrl+Z 撤销");
  }
});
属性含义
e.ctrlKey是否按着 Ctrl
e.shiftKey是否按着 Shift
e.altKey是否按着 Alt
e.metaKey是否按着 Cmd(Mac)或 Win(Windows)
e.key按键的字符串值
e.code物理键位代码

表单事件

input vs change

const input = document.querySelector("input");

input.addEventListener("input", function (e) {
  console.log("输入变化:", e.target.value); // 每次输入都触发
});

input.addEventListener("change", function (e) {
  console.log("值变更:", e.target.value); // 失去焦点且值变了才触发
});
事件触发时机频率
input每次输入/粘贴
change失去焦点且值变了
focus获得焦点-
blur失去焦点-

submit 事件

form.addEventListener("submit", function (e) {
  e.preventDefault(); // 阻止跳转
  const formData = new FormData(this);
  // 用 fetch 发送数据
});
Tip

input 事件适合实时校验,change 适合只在最终值确认时处理。

窗口事件

// 页面加载完成(包括图片、样式)
window.addEventListener("load", function () {
  console.log("所有资源加载完");
});

// DOM 解析完成(不用等资源)
document.addEventListener("DOMContentLoaded", function () {
  console.log("DOM 解析完成,可以操作元素了");
});

// 窗口大小变化
window.addEventListener("resize", function () {
  console.log("窗口大小变了:", window.innerWidth, window.innerHeight);
});

// 滚动
window.addEventListener("scroll", function () {
  console.log("滚动了");
});

// 页面关闭前
window.addEventListener("beforeunload", function (e) {
  e.preventDefault(); // 弹出确认框
});
Note

DOMContentLoadedload 触发早。如果只是操作 DOM 元素,用 DOMContentLoaded 更快。

触摸事件(移动端)

element.addEventListener("touchstart", function (e) {
  console.log("手指触碰");
});

element.addEventListener("touchmove", function (e) {
  console.log("手指移动");
});

element.addEventListener("touchend", function () {
  console.log("手指离开");
});

触摸位置

element.addEventListener("touchstart", function (e) {
  const touch = e.touches[0]; // 第一个手指
  console.log("触摸点:", touch.clientX, touch.clientY);
});
Tip

现代浏览器推荐用 Pointer Events(pointerdownpointermovepointerup),统一了鼠标、触摸、手写笔的处理。

element.addEventListener("pointerdown", function (e) {
  console.log("输入开始,类型:", e.pointerType); // mouse / touch / pen
});

焦点事件

input.addEventListener("focus", function () {
  console.log("获得焦点");
});

input.addEventListener("blur", function () {
  console.log("失去焦点");
});

// focusin/focusout 会冒泡
parent.addEventListener("focusin", function (e) {
  console.log("子元素获得了焦点");
});
事件冒泡
focus
blur
focusin
focusout

实用组合:防抖输入

搜索框输入时等用户停手再请求:

let timer;
searchInput.addEventListener("input", function () {
  clearTimeout(timer);
  timer = setTimeout(function () {
    console.log("用户停手了,请求搜索:", searchInput.value);
  }, 300); // 300ms 内没新输入才请求
});

事件速查表

类别事件典型用途
鼠标click, dblclick点击交互
鼠标mouseenter, mouseleave悬停效果
鼠标contextmenu自定义右键菜单
键盘keydown, keyup快捷键
表单input, change实时校验
表单submit拦截提交
窗口resize响应式布局
窗口scroll无限滚动
触摸touchstart/move/end移动端手势
触摸pointerdown/move/up统一输入事件
焦点focus, blur表单交互反馈
Tip

事件处理是 JavaScript 交互的核心。理解事件冒泡、事件委托、防抖节流这些模式,就能处理大部分交互需求。