什么是事件?

在JavaScript中,事件是网页中发生的”事情”,比如用户点击按钮、提交表单、页面加载完成等。JavaScript可以”监听”这些事件,并在事件发生时执行相应的代码。

常见的事件类型

鼠标事件

  • click - 当用户点击元素时触发
  • dblclick - 当用户双击元素时触发
  • mousedown - 当用户在元素上按下鼠标按钮时触发
  • mouseup - 当用户在元素上释放鼠标按钮时触发
  • mousemove - 当用户在元素上移动鼠标时触发
  • mouseover - 当鼠标移入元素时触发
  • mouseout - 当鼠标移出元素时触发

键盘事件

  • keydown - 当用户按下键盘按键时触发
  • keyup - 当用户释放键盘按键时触发
  • keypress - 当用户按下并释放键盘按键时触发

表单事件

  • submit - 当表单提交时触发
  • change - 当表单元素的值改变时触发
  • focus - 当元素获得焦点时触发
  • blur - 当元素失去焦点时触发

窗口事件

  • load - 当页面加载完成时触发
  • resize - 当窗口大小改变时触发
  • scroll - 当用户滚动页面时触发

事件监听的三种方式

1. HTML属性(不推荐)

1
<button onclick="alert('按钮被点击了!')">点击我</button>

2. DOM属性

1
2
3
document.getElementById("myButton").onclick = function() {
alert("按钮被点击了!");
};

3. addEventListener方法(推荐)

1
2
3
document.getElementById("myButton").addEventListener("click", function() {
alert("按钮被点击了!");
});

事件对象

当事件触发时,浏览器会创建一个事件对象,并将其作为参数传递给事件处理函数。这个对象包含了与事件相关的信息。

1
2
3
4
5
document.getElementById("myButton").addEventListener("click", function(event) {
console.log("事件类型:" + event.type);
console.log("目标元素:" + event.target);
console.log("鼠标坐标:" + event.clientX + ", " + event.clientY);
});

事件冒泡与捕获

当一个事件发生在一个元素上,它会首先在该元素上运行处理程序,然后在其父元素上运行,接着在其他祖先上运行。这个过程称为”事件冒泡”。

1
2
3
4
// 阻止事件冒泡
element.addEventListener("click", function(event) {
event.stopPropagation();
});

相反,事件捕获是从最外层的祖先元素开始,然后向下传播到触发事件的元素。

1
2
3
4
// 使用捕获阶段
element.addEventListener("click", function() {
alert("捕获阶段的处理程序");
}, true);

事件委托

事件委托是一种利用事件冒泡的技术,它允许我们将事件监听器添加到一个父元素,而不是每个子元素单独添加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 不使用事件委托
let buttons = document.getElementsByTagName("button");
for (let i = 0; i < buttons.length; i++) {
buttons[i].addEventListener("click", function() {
alert("按钮 " + i + " 被点击了!");
});
}

// 使用事件委托
document.getElementById("buttonContainer").addEventListener("click", function(event) {
if (event.target.tagName === "BUTTON") {
alert("按钮 " + event.target.id + " 被点击了!");
}
});

实际应用示例

表单验证

1
2
3
4
5
6
7
document.getElementById("myForm").addEventListener("submit", function(event) {
let username = document.getElementById("username").value;
if (username.length < 3) {
alert("用户名至少需要3个字符!");
event.preventDefault(); // 阻止表单提交
}
});

图片轮播

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
let currentSlide = 0;
const slides = document.getElementsByClassName("slide");

function showSlide(n) {
// 隐藏所有幻灯片
for (let i = 0; i < slides.length; i++) {
slides[i].style.display = "none";
}

// 显示当前幻灯片
slides[n].style.display = "block";
}

document.getElementById("nextButton").addEventListener("click", function() {
currentSlide = (currentSlide + 1) % slides.length;
showSlide(currentSlide);
});

document.getElementById("prevButton").addEventListener("click", function() {
currentSlide = (currentSlide - 1 + slides.length) % slides.length;
showSlide(currentSlide);
});

// 初始化显示第一张幻灯片
showSlide(currentSlide);

总结

JavaScript事件是实现网页交互的基础。通过合理使用事件监听、事件对象、事件冒泡与捕获以及事件委托等技术,我们可以创建出响应用户操作的动态网页。在实际开发中,推荐使用addEventListener方法来添加事件监听器,这样可以为同一事件添加多个处理程序,并且更容易移除。