事件模型
1. 监听函数定义:通过监听函数(listener)对事件做出反应。事件发生后,浏览器监听到了这个事件,就会执行对应的监听函数。这是事件驱动编程模式(event-driven)的主要编程方式
2. JS有三种方法:可以为事件绑定监听函数
(1)HTML的on-属性:
- HTML 语言允许在元素的属性中,直接定义某些事件的监听代码
1 <body onload="doSomething()">
2 <div onclick="console.log('触发事件')">
- 使用这个方法指定的监听代码,只会在冒泡阶段触发
1 <div onclick="console.log(2)">
2 <button onclick="console.log(1)">点击</button>
3 </div>
上面代码中,<button>是<div>的子元素。<button>的click事件,也会触发<div>的click事件。由于on-属性的监听代码,只在冒泡阶段触发,所以点击结果是先输出1,再输出2,即事件从子元素开始冒泡到父元素
- 直接设置
on-属性,与通过元素节点的setAttribute方法设置on-属性,效果是一样的
1 el.setAttribute('onclick', 'doSomething()');
2 // 等同于
3 // <Element onclick="doSomething()">
- 违反了 HTML 与 JS代码相分离的原则,将两者写在一起,不利于代码分工,因此不推荐使用
(2)元素节点的事件属性
- 元素节点对象的事件属性,同样可以指定监听函数
1 window.onload = doSomething;
2
3 div.onclick = function (event) {
4 console.log('触发事件');
5 };
- 使用这个方法指定的监听函数,也是只会在冒泡阶段触发
- 这种方法与 HTML 的
on-属性的差异是,它的值是函数名(doSomething),而不像后者,必须给出完整的监听代码(doSomething()) - 同一个事件只能定义一个监听函数,也就是说,如果定义两次
onclick属性,后一次定义会覆盖前一次。因此,也不推荐使用
(3)EventTarget.addEventListener()
window.addEventListener('load', doSomething, false);
- 所有 DOM 节点实例都有
addEventListener方法,用来为该节点定义事件的监听函数 - 作为推荐的指定监听函数的方法。它有如下优点:
- 同一个事件可以添加多个监听函数。
- 能够指定在哪个阶段(捕获阶段还是冒泡阶段)触发监听函数。
- 除了 DOM 节点,其他对象(比如
window、XMLHttpRequest等)也有这个接口,它等于是整个 JavaScript 统一的监听函数接口
3. 监听函数内部的this指向触发事件的那个元素节点
<button id="btn" onclick="console.log(this.id)">点击</button>
执行上面代码,点击后会输出btn
其他两种监听函数的写法,this的指向也是如此
// HTML 代码如下 // <button id="btn">点击</button> var btn = document.getElementById('btn'); // 写法一 btn.onclick = function () { console.log(this.id); }; // 写法二 btn.addEventListener( 'click', function (e) { console.log(this.id); }, false );
上面两种写法,点击按钮以后也是输出btn

浙公网安备 33010602011771号