## 10.2 事件处理程序
响应某个事件的函数就叫做**事件处理程序(或事件侦听器)**。
### 10.2.1 HTML事件处理程序
某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名 HTML特性来指定。
在HTML中定义的事件处理程序可以包含要执行的具体动作,也可以调用在页面其他地方定义的脚本。
特点:
* 创建一个封装着元素属性值的函数。这个函数中有一个局部变量event,即事件对象。通过event变量,可以直接访问事件对象。在函数内部,this值等于时间的目标元素。
* 扩展作用域的方式:在函数内部,可以像访问局部变量一样访问document及该元素本身的成员。
缺点:
* 存在一个时差问题。因为用户可能会在HTML元素一出现在页面上就触发相应的事件,但当时的事件处理程序有可能尚不具备执行条件。
* 扩展事件处理程序的作用域链在不同浏览器中会导致不同结果。
* HTML与JavaScript代码紧密耦合。
### 10.2.2 DOM0级事件处理程序
通过JavaScript指定事件处理程序的传统方式,将一个函数赋值给一个事件处理程序属性。
每个元素(包括window和document)都有自己的事件处理程序。
删除可设置,如`btn.onclick = null;`
### 10.2.3 DOM2级事件处理程序
“DOM2级事件”定义了两个方法,用于处理指定和删除时间处理程序的操作:`addEventListener()和removeEventListener()`。所有节点中都包含这两个方法,并且接受3个参数:要处理的事件名(前头无on)、作为事件处理程序的函数和一个布尔值(true表示在捕获阶段调用时间处理程序,false表示在冒泡阶段调用。)
~~~
var btn = document.getElementById("mybtn");
btn.addEventListener("click",function(){
alert(this.id);
},false); //多数为false,最大限度兼容各种浏览器。
~~~
通过addEventListener()添加的事件处理程序**只能**使用removeEventListener()来移除;移除时传入的参数与添加处理程序时使用的参数相同,意味着**添加的匿名函数将无法移除,建议传入函数名。**
### 10.2.4 IE事件处理程序
IE实现了与DOM中类似的两个方法:attachEvent()和detachEvent()。两个方法接受相同的两个参数:事件处理程序名称(前缀on)与事件处理程序函数。
添加多个事件出程序时,按添加的相反顺序被处罚。
添加的匿名函数也将不能被移除。
### 10.2.5 跨浏览器的事件处理程序
~~~
var EventUtil = {
addHandler: function (element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler,false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, handler);
} else if (element != window) {
element['on' + type] = handler;
}
},
removeHandler: function (element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.detachEvent) {
element.detachEvent('on' + type, handler);
} else if (element != window) {
element['on' + type] = null;
}
}
};
var btn = document.getElementById("mybtn");
var handler = function(){
alert("Clicked");
};
EventUtil.addHandler(btn,"click",handler);
EventUtil.removeHandler(btn,"click",handler);
~~~
- 前言
- 第一章 JavaScript简介
- 第三章 基本概念
- 3.1-3.3 语法、关键字和变量
- 3.4 数据类型
- 3.5-3.6 操作符、流控制语句(暂略)
- 3.7函数
- 第四章 变量的值、作用域与内存问题
- 第五章 引用类型
- 5.1 Object类型
- 5.2 Array类型
- 5.3 Date类型
- 5.4 基本包装类型
- 5.5 单体内置对象
- 第六章 面向对象的程序设计
- 6.1 理解对象
- 6.2 创建对象
- 6.3 继承
- 第七章 函数
- 7.1 函数概述
- 7.2 闭包
- 7.3 私有变量
- 第八章 BOM
- 8.1 window对象
- 8.2 location对象
- 8.3 navigator、screen与history对象
- 第九章 DOM
- 9.1 节点层次
- 9.2 DOM操作技术
- 9.3 DOM扩展
- 9.4 DOM2和DOM3
- 第十章 事件
- 10.1 事件流
- 10.2 事件处理程序
- 10.3 事件对象
- 10.4 事件类型
- 第十一章 JSON
- 11.1-11.2 语法与序列化选项
- 第十二章 正则表达式
- 12.1 创建正则表达式
- 12.2-12.3 模式匹配与RegExp对象
- 第十三章 Ajax
- 13.1 XMLHttpRequest对象
- 你不知道的JavaScript
- 一、作用域与闭包
- 1.1 作用域
- 1.2 词法作用域
- 1.3 函数作用域与块作用域
- 1.4 提升
- 1.5 作用域闭包
- 二、this与对象原型
- 2.1 关于this
- 2.2 全面解析this
- 2.3 对象
- 2.4 混合对象“类”
- 2.5 原型
- 2.6 行为委托
- 三、类型与语法
- 3.1 类型
- 3.2 值
- 3.3 原生函数