这是我参与8月更文挑战的第21天,活动详情查看: 8月更文挑战
序言
我们经常有使用浏览器中的事件,但是对我们而言,仅仅是调用 API 而已,甚至不知道事件是如何触发,和为什么事件触发会执行我们的回调函数,今天我们来细致的了解一下浏览器事件的相关问题。
浏览器中的各种事件
事件就是一件事情发生的信号,在浏览器中,每个DOM发出的信号,都是一个事件,根据不同的操作,发出不同的信号,就是不同的事件,以下是一些常用事件 鼠标事件:
- click —— 当鼠标点击一个元素时(触摸屏设备会在点击时生成)。
- contextmenu —— 当鼠标右键点击一个元素时。
- mouseover / mouseout —— 当鼠标指针移入/离开一个元素时。
- mousedown / mouseup —— 当在元素上按下/释放鼠标按钮时。
- mousemove —— 当鼠标移动时。
键盘事件:
keydown 和 keyup —— 当按下和松开一个按键时。
表单(form)元素事件:
- submit —— 当访问者提交了一个 时。
- focus —— 当访问者聚焦于一个元素时,例如聚焦于一个 。
Document 事件: DOMContentLoaded —— 当 HTML 的加载和处理均完成,DOM 被完全构建完成时。 CSS 事件: transitionend —— 当一个 CSS 动画完成时。
事件处理程序
在对事件作出响应时,我们可以分配一个处理程序,一个事件发生的时候触发的函数,也就是我们定义的回调函数,有以下几种分配方法
HTML 特性
处理程序可以设置在 HTML 中名为 on 的特性(attribute)中。 例如,要为一个 input 分配一个 click 处理程序,我们可以使用 onclick,像这样;
<input value="Click me" onclick="alert('Click!')" type="button">
在鼠标点击时,onclick 中的代码就会运行。 HTML 特性不是编写大量代码的好位置,因此我们最好创建一个 JavaScript 函数,然后在 HTML 特性中调用这个函数。 在这里点击会运行 countRabbits():
<script>
function countRabbits() {
for(let i=1; i<=3; i++) {
alert("Rabbit number " + i);
}
}
</script>
<input type="button" onclick="countRabbits()" value="Count rabbits!">
我们知道,HTML 特性名是大小写不敏感的,所以 ONCLICK 和 onClick 以及 onCLICK 都一样可以运行。但是特性通常是小写的:onclick。
DOM 属性
我们可以使用 DOM 属性(property)on 来分配处理程序。 例如 elem.onclick
<input id="elem" type="button" value="Click me">
<script>
elem.onclick = function() {
alert('hello coolFish');
};
</script>
如果一个处理程序是通过 HTML 特性(attribute)分配的,那么随后浏览器读取它,并从特性的内容创建一个新函数,并将这个函数写入 DOM 属性(property)。 因此,这种方法实际上与前一种方法相同。 这两段代码工作相同:
- HTML
<input type="button" onclick="alert('Click!')" value="Button">
- HTML + JS
<input type="button" id="button" value="Button">
<script>
button.onclick = function() {
alert('Click!');
};
</script>
在第一个例子中,button.onclick 是通过 HTML 特性(attribute)初始化的,而在第二个例子中是通过脚本初始化的。这是它们唯一的不同之处。 因为这里只有一个 onclick 属性,所以我们无法分配更多事件处理程序。 在下面这个示例中,我们使用 JavaScript 添加了一个处理程序,覆盖了现有的处理程序
<input type="button" id="elem" onclick="alert('Before')" value="Click me">
<script>
elem.onclick = function() { // 覆盖了现有的处理程序
alert('After'); // 只会显示此内容
};
</script>
要移除一个处理程序 —— 赋值 elem.onclick = null。