Javascript 的addEventListener()及attachEvent()区别分析


Posted in Javascript onMay 21, 2009

Mozilla中:

addEventListener的使用方式:

target.addEventListener(type, listener, useCapture);

target: 文档节点、document、window 或 XMLHttpRequest。
type: 字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。
listener :实现了 EventListener 接口或者是 JavaScript 中的函数。
useCapture :是否使用捕捉,一般用 false 。例如:document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);

IE中:

target.attachEvent(type, listener);
target: 文档节点、document、window 或 XMLHttpRequest。
type: 字符串,事件名称,含“on”,比如“onclick”、“onmouseover”、“onkeydown”等。
listener :实现了 EventListener 接口或者是 JavaScript 中的函数。 例如:document.getElementById("txt").attachEvent("onclick",function(event){alert(event.keyCode);});

W3C 及 IE 同时支持移除指定的事件, 用途是移除设定的事件, 格式分别如下:

W3C格式:

removeEventListener(event,function,capture/bubble);

Windows IE的格式如下:

detachEvent(event,function);

target.addEventListener(type, listener, useCapture);
target 文档节点、document、window 或 XMLHttpRequest。
type 字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。
listener 实现了 EventListener 接口或者是 JavaScript 中的函数。
useCapture 是否使用捕捉,看了后面的事件流一节后就明白了,一般用 false
事件触发时,会将一个 Event 对象传递给事件处理程序,比如:
document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);
适应的浏览器版本不同,同时在使用的过程中要注意
attachEvent方法 按钮onclick IE中使用
addEventListener方法 按钮click fox中使用
两者使用的原理:可对执行的优先级不一样,下面实例讲解如下:
attachEvent方法,为某一事件附加其它的处理事件。(不支持Mozilla系列)
addEventListener方法 用于 Mozilla系列
举例: document.getElementById("btn").onclick = method1;
document.getElementById("btn").onclick = method2;
document.getElementById("btn").onclick = method3;如果这样写,那么将会只有medhot3被执行
写成这样:
var btn1Obj = document.getElementById("btn1"); //object.attachEvent(event,function);
btn1Obj.attachEvent("onclick",method1);
btn1Obj.attachEvent("onclick",method2);
btn1Obj.attachEvent("onclick",method3);执行顺序为method3->method2->method1
如果是Mozilla系列,并不支持该方法,需要用到addEventListener var btn1Obj = document.getElementById("btn1");
//element.addEventListener(type,listener,useCapture);
btn1Obj.addEventListener("click",method1,false);
btn1Obj.addEventListener("click",method2,false);
btn1Obj.addEventListener("click",method3,false);执行顺序为method1->method2->method3
实例:(要注意的是div必须放到js前面才行)

<html> 
<head> 
</head> 
<body> 
<div id="name1" style="border:1px solid red;padding:10px 10px 10px 10px;" style="border:1px solid red;padding:10px 10px 10px 10px;"> 
<div id="name2" style="border:1px solid green;padding:10px 10px 10px 10px;" style="border:1px solid green;padding:10px 10px 10px 10px;">点击</div> 
</div> 
<div id="info"></div> 
<script type="text/javascript"><!-- 
var name1=document.getElementById('name1'); //要注意 
var name2=document.getElementById('name2'); //要注意 
var info=document.getElementById('info'); 
if(name1.attachEvent){ //对于attachEvent前面的target我们一定要保证不为空 
name1.attachEvent('onclick',function () { info.innerHTML += "红色" + "<br>"; }); 
name2.attachEvent('onclick',function () { info.innerHTML += "绿色" + "<br>"; }); 
}else{ 
name1.addEventListener('click',function () { info.innerHTML += "红色" + "<br>"; },false); 
name2.addEventListener('click',function () { info.innerHTML += "绿色" + "<br>"; },false); 
} 
// --></script> 
</body> 
</html>

从W3C的发展时间轴来看, DOM(Document Object Model)的模型可以分为两种, DOM 0 及 DOM 2. 从数字来看就可以知道DOM 0 当然是比较旧的协议, 我们可以从以下的表格来看:

DOM1 协定:

Event Name Description
onblur() The element has lost focus (that is, it is not selected by the user).
onchange0 The element has either changed (such as by typing into a text field) or the element has lost focus.
onclick0 The mouse has been clicked on an element.
ondblclick() The mouse has been double-clicked on an element.
onfocus() The element has gotten focus.
onkeydown() A keyboard key has been pressed down (as opposed to released) while the element has focus.
onkeypress() A keyboard key has been pressed while the element has focus.
onkeyup() A keyboard key has been released while the element has focus.
onload() The element has loaded (document, frameset, or image).
onmousedown() A mouse button has been pressed.
onmousemove() The mouse has been moved.
onmouseout() The mouse has been moved off of or away from an element.
onmouseover() The mouse has moved over an element.
onmouseup() A mouse button has been released.
onreset() The form element has been reset, such as when a form reset button is pressed.
onresize() The window's size has been changed.
onselect() The text of a form element has been selected.
onsubmit() The form has been submitted.
onunload() The document or frameset has been unloaded.

DOM2 的进化:

DOM 0 Event DOM 2 Event
onblur() blur
onfocus() focus
onchange() change
onmouseover() mouseover
onmouseout() mouseout
onmousemove() mousemove
onmousedown() mousedown
onmouseup() mouseup
onclick() click
ondblclick() dblclick
onkeydown() keydown
onkeyup() keyup
onkeypress() keypress
onsubmit() submit
onload() load
onunload() unload

 新的DOM2 用法可以addEventListener()这个函数来观察到:

addEventListener(event,function,capture/bubble);

参数event如上表所示, function是要执行的函数, capture与bubble分别是W3C制定得两种时间模式,简单来说capture就是从document的开始读到最后一行, 再执行事件, 而bubble则是先寻找指定的位置再执行事件.
capture/bubble的参数是布尔值, True表示用capture, False则是bubble.Windows Internet Explorer也有制定一种EventHandler, 是 attachEvent(), 格式如下:

window.attachEvent(”submit”,myFunction());

比较特别的是attachEvent不需要指定capture/bubble的参数, 因为在windows IE环境下都是使用Bubble的模式.这里用图像的Rollover例子来表现事件的用法:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN”
“http://www.w3.org/TR/html4/strict.dtd“>
<html>
<head>
<title>Rollover</title>
<script type=”text/javascript”>function moveOver(imgObj) {
  if (typeof window.addEventListener != “undefined”) {
  imgObj.addEventListener(”mouseover”,function(){imgObj.src = imgObj.id +
“_over.png”;}, false);
  imgObj.addEventListener(”mouseout”, function(){imgObj.src = imgObj.id +
“_default.png”;}, false);
  } else {
  imgObj.attachEvent(”onmouseover”,function(){imgObj.src = imgObj.id +
“_over.png”;});
  imgObj.attachEvent(”onmouseout”, function(){imgObj.src = imgObj.id +
“_default.png”;});
  }
}

function rollover() {
var images = document.getElementsByTagName(”img”);
var roll = new RegExp (”rollover”);
var preload = [];
for (var i = 0; i < images.length; i++) {
  if (images[i].id.match(roll)) {
  preload[i] = new Image();
  preload[i].src = images[i].id + “_over.png”;

  moveOver(images[i]);
  }
}
}
if (typeof window.addEventListener != “undefined”) {
  window.addEventListener(”load”,rollover,false);
} else {
  window.attachEvent(”onload”,rollover)
}
</script>
</head>
<body>
<p><img id=”rollover_home” name=”img_home” src=”rollover_home_default.png”
alt=”Home”></p>
<p><img id=”rollover_about” name=”img_about” src=”rollover_about_default.png”
alt=”About”></p>
<p><img id=”rollover_blog” name=”img_blog” src=”rollover_blog_default.png”
alt=”Blog”></p>
<p><img id=”logo” name=”img_logo” src=”logo.png” alt=”Braingia Logo”></p>
</body>
</html>

上述的 typeof window.addEventListener != “undefined” 程序代码可以判断使用者的浏览器是否支持AddEventListener这个事件模型, 如果不支持就使用attachEvent.

W3C 及 IE 同时支持移除指定的事件, 用途是移除设定的事件, 格式分别如下:

W3C格式:

removeEventListener(event,function,capture/bubble);

Windows IE的格式如下:

detachEvent(event,function);

数据参考: Chapter 14 - Browsers and JavaScript, JavaScript Step by Step, by Steve Suehring

Javascript 相关文章推荐
实例:用 JavaScript 来操作字符串(一些字符串函数)
Feb 15 Javascript
IE6中使用position导致页面变形的解决方案(js代码)
Jan 09 Javascript
jquery移除、绑定、触发元素事件使用示例详解
Apr 10 Javascript
让angularjs支持浏览器自动填表
Nov 10 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
Aug 18 Javascript
Bootstrap菜单按钮及导航实例解析
Sep 09 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
Nov 05 Javascript
JS实现间歇滚动的运动效果实例
Dec 22 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 jQuery
nuxt框架中对vuex进行模块化设置的实现方法
Sep 06 Javascript
js 实现验证码输入框示例详解
Sep 23 Javascript
W3C Group的JavaScript1.8 新特性介绍
May 19 #Javascript
JS backgroundImage控制
May 19 #Javascript
jQuery 源代码显示控件 (Ajax加载方式).
May 18 #Javascript
编写兼容IE和FireFox的脚本
May 18 #Javascript
innerText和innerHTML 一些问题分析
May 18 #Javascript
JS 页面自动加载函数(兼容多浏览器)
May 18 #Javascript
Js 本页面传值实现代码
May 17 #Javascript
You might like
PHP生成图片验证码功能示例
2017/01/12 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
Python本地与全局命名空间用法实例
2015/06/16 Python
利用Python获取操作系统信息实例
2016/09/02 Python
Python中表示字符串的三种方法
2017/09/06 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
Python如何安装第三方模块
2020/05/28 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
Ajax主要包含了哪些技术
2014/06/12 面试题
如何写好优秀的创业计划书
2014/01/30 职场文书
合伙协议书范本
2014/04/21 职场文书
文明社区申报材料
2014/08/21 职场文书
成绩单评语
2015/01/04 职场文书
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript