Z
ZHANK
DOM 与事件

事件处理

学习 addEventListener、事件对象、常见事件

事件处理

事件让页面能够响应用户交互——点击、输入、滚动等。

学完本章你将: 掌握 addEventListener、事件对象、常见事件类型。


绑定事件

javascript
let btn = document.querySelector("button");

// addEventListener(推荐)
btn.addEventListener("click", function(event) {
    console.log("按钮被点击!", event);
});

// 箭头函数
btn.addEventListener("click", (e) => {
    console.log("点击坐标:", e.clientX, e.clientY);
});

// ⚠️ onclick 属性(不推荐,只能绑定一个)
// btn.onclick = function() { ... };

// 移除事件
function handler() { console.log("once"); }
btn.addEventListener("click", handler);
btn.removeEventListener("click", handler);

事件对象

javascript
document.addEventListener("click", (e) => {
    // 鼠标位置
    console.log("页面坐标:", e.pageX, e.pageY);
    console.log("窗口坐标:", e.clientX, e.clientY);

    // 目标元素
    console.log("点击的元素:", e.target);
    console.log("绑定事件的元素:", e.currentTarget);

    // 阻止默认行为
    // e.preventDefault();

    // 阻止冒泡
    // e.stopPropagation();
});

常见事件类型

javascript
// 鼠标事件
el.addEventListener("click", handler);       // 单击
el.addEventListener("dblclick", handler);    // 双击
el.addEventListener("mousedown", handler);   // 按下
el.addEventListener("mouseup", handler);     // 释放
el.addEventListener("mouseenter", handler);  // 进入(不冒泡)
el.addEventListener("mouseover", handler);   // 进入(冒泡)
el.addEventListener("mouseleave", handler);  // 离开

// 键盘事件
document.addEventListener("keydown", (e) => {
    console.log(e.key, e.code); // "Enter"  "Enter"
    // 组合键
    if (e.ctrlKey && e.key === "s") {
        e.preventDefault();
        console.log("Ctrl+S 被按下");
    }
});

// 表单事件
input.addEventListener("input", handler);    // 输入变化
input.addEventListener("change", handler);   // 值确认变化
input.addEventListener("focus", handler);    // 获得焦点
input.addEventListener("blur", handler);     // 失去焦点
form.addEventListener("submit", handler);    // 提交

事件选项

javascript
// once:只触发一次
btn.addEventListener("click", () => {
    console.log("只执行一次");
}, { once: true });

// passive:不调用 preventDefault(性能优化)
document.addEventListener("touchstart", handler, { passive: true });

// capture:捕获阶段触发(默认 false 为冒泡阶段)
el.addEventListener("click", handler, { capture: true });