事件就是用户或浏览器自身执行的某种动作。诸如 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. JavaScript--DOM浏览器窗口可视区域大小

    浏览器窗口可视区域大小 获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法: 一.对于IE9+.Chrome.Firefox.Opera 以及 Safari: •  window.inn ...

  2. python中字典的陷阱

    把字典与列表组合,如 i=20 s=[]#定义一个空列表 b={'d':i}#定义一个字典 while i>0: i=i-1 b['d']=i#更新字典的值 s.append(b) print( ...

  3. _bzoj1015 [JSOI2008]星球大战starwar【并查集】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1015 倒过来做就ok了. #include <cstdio> #include ...

  4. 水题 Codeforces Round #306 (Div. 2) A. Two Substrings

    题目传送门 /* 水题:遍历一边先找AB,再BA,再遍历一边先找BA,再AB,两种情况满足一种就YES */ #include <cstdio> #include <iostream ...

  5. WebSphere中数据源连接池太小导致的连接超时错误记录

    WebSphere中数据源连接池太小导致的连接超时错误记录. 应用连接超时错误信息: [// ::: CST] webapp E com.ibm.ws.webcontainer.webapp.WebA ...

  6. LN : leetcode 123 Best Time to Buy and Sell Stock III

    lc 123 Best Time to Buy and Sell Stock III 123 Best Time to Buy and Sell Stock III Say you have an a ...

  7. android ListView 分析(一)

    需要了解的内容 1. listview中的getItemAtPosition与Adapter的getItem的position的区别          listView中的getItemAtPosit ...

  8. axis2客户端的几种调用方式

    (1)使用RPC方式调用WebService // 使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient( ...

  9. div根据鼠标的移入移除显示隐藏

    onmouseout  是把div当成一个对象,div里面包含的元素当成别的对象,所以移动的时候,会隐藏,达不到我们预期的效果. onmouseleave 就是把整个div当成一个对象. 大家可以去试 ...

  10. 「Python调试器」,快速定位各种疑难杂症!!

    现在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要 ...