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 相关文章推荐
图片上传即时显示缩略图的js代码
May 27 Javascript
jQuery EasyUI API 中文文档 - Form表单
Oct 06 Javascript
防止jQuery ajax Load使用缓存的方法小结
Feb 22 Javascript
JavaScript计算某一天是星期几的方法
Aug 05 Javascript
Node.js中npm常用命令大全
Jun 09 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
Nov 04 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
Nov 27 Javascript
通过扫小程序码实现网站登陆功能
Aug 22 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
Jan 21 Javascript
浅谈javascript事件环微任务和宏任务队列原理
Sep 12 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
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 文件上传实例代码
2012/04/19 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
Python 3.8 新功能全解
2019/07/25 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
python 如何对logging日志封装
2020/12/02 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
家佳咖啡店创业计划书
2013/12/27 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
护士实习自荐信
2015/03/06 职场文书
小学英语教学随笔
2015/08/14 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS