事件就是用户或浏览器自身执行的某种动作。诸如 click、load 和 mouseover ,都是事件的名字。而响应某个事件的函数就叫做事件处理程序(或事件侦听器)。事件处理程序的名字以“on”开头,因此click事件的事件处理程序就是onclick,load事件的事件处理程序就是onload。为事件指定处理程序的方式有好几种。

一、DOM0 级事件处理程序

1、指定事件处理程序:以“on”开头,后面接事件名称,然后把一个匿名函数表达式或者函数作为属性值赋值给这个属性,就为这个元素指定了时间处理函数。

示例代码:

html:

<div id="div1"></div>

javascript:

var oDiv = document.getElementById('div1');
oDiv.onclick = function(){
console.log("Clicked !");
};

2、删除事件处理程序:将事件处理程序属性的值设置为null就可以删除该元素的该事件的处理程序。

oDiv.onclick = null;

二、DOM2 级事件处理程序

  “DOM2级事件”定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener() 和 removeEventListener()。所有DOM节点中都包含这两个方法,并且它们都接受3个参数:要处理的事件名(不带“on”)、作为事件处理程序的函数和一个布尔值。最后这个布尔值参数如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。

1、指定事件处理程序:addEventListener()

var oDiv = document.getElementById('div1');
oDiv.addEventListener("click", function(){
console.log(this.id);
}, false);

  上面的代码为div添加了 onclick 事件处理程序,而且该事件会在冒泡阶段被触发(因为最后一个参数是false)。与DOM0级方法一样,这里添加的事件处理程序也是在其依附的元素的作用域中运行。使用 DOM2 级方法添加事件处理程序的主要好处是可以添加多个事件处理程序。看看下面的例子:

var oDiv = document.getElementById('div1');
oDiv.addEventListener("click", function(){
console.log(this.id);
}, false);
oDiv.addEventListener("click", function(){
console.log("Hello World !");
}, false);

  这里为oDiv的 onclick 事件添加了两个事件处理程序,在点击oDiv的时候这两个事件处理都会被触发,而且触发的顺序和定义的顺序保持一致。依次是弹出oDiv的id属性值和“Hello World !”。

  

2、移除事件处理程序:removeEventListener()

  使用addEventListener()添加的事件处理程序只能通过removeEventListener()来移除;移除时传入的参数与添加处理程序时使用的参数相同。这也意味着通过 addEventListener() 添加的匿名函数将无法移除,如下面的例子:

var oDiv = document.getElementById('div1');
oDiv.addEventListener("click", function(){
console.log(this.id);
}, false); // 省略其它代码 oDiv.removeEventListener("click", function(){
console.log(this.id);
}, false);

  在这个例子中,我们使用了 addEventListener() 添加了一个事件处理程序。虽然调用了 removeEventListener() 时看似使用了相同的参数,但实际上,第二个参数与传入 addEventListener() 中的那一个是完全不同的函数。而传入 removeEventListener() 中的事件处理程序函数必须与传入 addEventListener() 中的相同,如下面的例子所示:

var oDiv = document.getElementById('div1');
var handler = function(){
console.log(this.id);
};
oDiv.addEventListener("click", handler, false); // 省略其它代码 oDiv.removeEventListener("click", handler, false);

  重写后的这个例子没有问题,是因为在 addEventListener() 和 removeEventListener() 中使用了相同的函数。

  注意:最后需要注意的点是在大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这样可以最大限度地兼容各种浏览器。最好只在需要在事件到达目标之前截获它的时候将事件处理程序添加到捕获阶段。如果不是特别需要,我们不建议在事件捕获阶段注册事件处理程序。

  IE9、Firefox、Safari、Chrome 和 Opera 支持 DOM2 级事件处理程序。

三、IE 事件处理程序

  IE 中指定和移除事件处理程序的两个方法分别是:attachEvent() 和 DetachEvent()。这两个方法接受相同的两个参数:事件处理程序和事件处理程序函数。由于 IE8 及之前的IE版本之支持事件冒泡,所以通过 attachEvent() 添加的事件处理程序都会被添加到事件流的冒泡阶段。

1、指定事件处理程序:attachEvent()

  要使用 attachEvent() 为oDiv添加一个事件处理程序,可以使用下面这段代码:

var oDiv = document.getElementById("div1");
oDiv.attachEvent("onclick", function(){
console.log("Clicked !");
});

  使用 attachEvent() 指定事件处理程序的时候需要注意的是传入的第一个参数是“onclick”, 而不是DOM2级事件中 addEventListener() 方法中的“click”。

  与DOM0级方法的区别:在 IE 中使用 attachEvent() 与使用 DOM0 级方法的主要区别在于事件处理程序的作用域。在使用 DOM0 级方法的情况下,事件处理程序会在其所属元素的作用域内运行;在使用 attachEvent() 方法的情况下,事件处理程序会在全局作用域中运行,因此此时的 this 等于 window。来看下面的例子:

var oDiv = document.getElementById("div1");
oDiv.attachEvent("onclick", function(){
console.log(this === window); // true
});

  attachEvent() 方法与 addEventListener() 方法类似,attachEvent() 方法也可以为一个元素添加多个事件处理程序。看看下面的例子:

var oDiv = document.getElementById("div1");
oDiv.attachEvent("onclick", function(){
console.log("Clicked !");
});
oDiv.attachEvent("onclick", function(){
console.log("Hello World !");
});

  这段代码调用了两次 attachEvent() 方法,为同一个元素添加了两个不同的事件处理程序。不过,与 addEventListener() 不同的是,这些事件处理程序不是以添加他们的顺序执行,而是以相反的顺序被触发。单击这个例子中的oDiv,首先看到的是"Hello World !" ,然后才是"Clicked !"。

2、移除事件处理程序: detachEvent()

  使用 attachEvent() 方法添加的事件处理程序只能通过 detachEvent() 方法来移除,条件和DOM2级事件处理程序一样,必须提供相同的参数。也就是说通过 attachEvent() 方法添加的匿名函数将不能被移除。下面来看看移除事件处理程序的例子:

var oDiv = document.getElementById("div1");
var handler = function(){
console.log("Clicked !");
};
oDiv.attachEvent("onclick", handler); // 省略其它代码 oDiv.detachEvent("onclick", handler);

注意:IE11 中不支持 attachEvent() 和 detachEvent() 方法为元素指定和移除事件处理程序。

四、跨浏览器的事件处理程序

  为了兼容不同浏览器支持的事件处理程序的差异,下面编写一个简单的事件处理程序js工具类:

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 {
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 {
element["on" + type] = null;
}
} };

  使用这个工具类中的 addHandler() 和 removeHandler() 方法为元素指定和移除事件处理程序的时候,首先会检查元素支不支持 DOM2 级方法,如果支持就使用 DOM2 级方法。如果不支持的话再检查是不是IE浏览器,如果是则使用IE中的方法,如果不是就使用 DOM0 级方法。不过在使用 DOM0 级方法指定事件处理程序的时候只能为元素指定一个事件处理函数,如果指定多个,后添加的会覆盖前面添加的事件处理程序。

学习javascript中的事件——事件处理程序的更多相关文章

  1. 在javascript中如何取消事件冒泡

    如果在javascript中只希望事件发生在它的目标而不是在它的父元素上,即取消它的冒泡事件的发生,该如何做?因为按照javascript发生事件的顺序,它由两个阶段:分别从根元素--父元素--目标元 ...

  2. 如何理解并学习javascript中的面向对象(OOP) [转]

    如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript ...

  3. 学习javascript中的事件——事件流

    事件概念: HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件onclick.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件.想要知道 ...

  4. JavaScript中常用的事件

    .onclick事件 点击事件(onclick并不是js中的方法,onclick只是浏览器提供js的一个dom接口,让js可以操作dom,所以onclick大小写都是没问题的,比如HTML代码就不用区 ...

  5. JavaScript中冒泡与事件委托

    冒泡 事件触发后事件流的三个阶段按顺序依次是: 1.捕获阶段 2.目标阶段 3.冒泡阶段 大盒子包裹小盒子,两个盒子都分别添加点击事件,当点击小盒子,两个盒子的事件都会触发. 事件委托 下级元素委托上 ...

  6. JavaScript中的方法事件和函数的方法的三种方法

    js中的很多事件  而事件相对应的就是方法(函数 )那么今天所说的就是这三种方法      已onclick事件为例 1: 基本方法 <div id="a" onclick= ...

  7. 再次学习javascript中的參数传递

     javascript中的全部函数的參数传递都是依照值传递的,做了以下測试:    function addTen(num){ num +=10; return num; } var count = ...

  8. javascript中的scroll事件

    window.addEventListener('scroll',function(){ if(document.compatMode == "CSS1Compat") { ale ...

  9. javascript中window.event事件用法详解

    转自http://www.jb51.net/article/32564.htm描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生 ...

随机推荐

  1. 5分钟了解Python语言的简单介绍(转载)

    < 转载于Python数据之道 - 本公众号秉承“让数据更有价值”的理念,主要分享数据相关的内容,包括数据分析,挖掘,可视化,机器学习,深度学习等.>                    ...

  2. JavaScript编程艺术-第7章代码汇总(1)

    1.document.write()(HTML与JS未分离) HTML: JS: 2..innerHTML(直接覆盖) HTML: JS: 3.getAttribute.setAttribute.ge ...

  3. Linux的防火墙概念

    #linux的防火墙概念#因为如果你不关防火墙,很可能运行 django.nginx.mysql出错#防火墙可能会阻挡端口流量的 出口#也会阻挡外来请求的 入口 #selinux iptables f ...

  4. AngularJs调用NET MVC 控制器中的函数进行后台操作

    题目中提到的控制器指的是.NET  MVC的控制器,不是angularjs的控制器. 首先看主页面的代码: <!DOCTYPE html> <html> <head> ...

  5. 转】Nodejs对MongoDB模糊查询

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: Jul 1, 2013 Tag ...

  6. AJPFX实践 java实现快速排序算法

    快速排序算法使用的分治法策略来把一个序列分为两个子序列来实现排序的思路: 1.从数列中挑出一个元素,称为“基准“2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面 ...

  7. Maximum Subsequence Sum 最大子序列和的进击之路

    本文解决最大子序列和问题,有两个题目组成,第二个题目比第一个要求多一些(其实就是要求输出子序列首尾元素). 01-复杂度1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N1​​, N2 ...

  8. 《effective java》中文第2版 note

    ,第15条[66]: 为不可变类提供静态工厂, eg : Integer/BigInteger 使用了静态工厂缓存了一些常用的实例, 通常 Integer -128 ~ +127. BigIntege ...

  9. Oracle Mysql的jdbc连接

    Oracle和MySql的jdbc或连接池中的连接,写下来以便随时参考 Oracle: driverClassName=oracle.jdbc.driver.OracleDriver url=jdbc ...

  10. javscript 导出html中的table到excel

    <script language="JavaScript" type="text/javascript"> /* * 默认转换实现函数,如果需要其他 ...