JavaScript Event学习第五章 高级事件注册模型


Posted in Javascript onFebruary 07, 2010

W3C和微软都着力于发展自己的事件注册模型来取代Netscape的传统模型。虽然对于微软的模型我不是很感冒,但是w3c的还是不错的,除了这个鼠标定位 的问题。不过现在只有小部分浏览器支持。
W3C
W3C的DOM层面事件规范注意到了传统模式的问题。他对于你想在一个元素上绑定多个事件提供了一个很好的解决办法。
W3C事件注册模型的关键就是addEventListener()。你给他三个参数:事件类型,要执行的函数和一个布尔值(true或者false)我一会再解释。把我们熟知的doSomething()函数注册到一个元素的onclick事件上,你可以这样做:
element.addEventListener('click',doSomething,false)
这种模型的魅力在于我们可以想加多少监听就可以加多少。如果用我们之前的传统模式里面的例子,我们就可以写成这样:
element.addEventListener('click',startDragDrop,false)
element.addEventListener('click',spyOnUser,false)
当用户点击元素的时候两个事件处理程序都会执行。需要注意的是W3C标准不能确定哪个事件先执行。所以你也不能认为startDragDrop()就在spyOnUser()之前执行。
移除事件处理程序也是非常的简单,用removeEventListener()就行了。所以:
element.removeEventListener('click',spyOnUser,false)
就会移除第二个事件处理程序但是第一个不会发生变化。非常漂亮的程序,完全解决了传统模式下的问题。

匿名函数
在W3C模式下你依然可以使用匿名函数:

element.addEventListener('click',function () { 
this.style.backgroundColor = '#cc0000' 
},false)

true或者false
true或者false是addEventListener的最后一个参数,意思是你想让你的函数在捕获阶段还是冒泡阶段执行。如果你不确定,那就使用false(冒泡阶段)。
this
在JavaScript里this关键字通常指函数的所有者。如果this指向事件发生的HTML元素,那么一切都是那么的美好,你可以很简单的做很多事情。
不幸的是,虽然this非常的强大,但是如果你不是明确的知道他怎么运作的话使用起来还是比较难的。关于这个我在另一个地方有详细的讨论。
在w3c模型下他的运作和在传统模式下是一样的:他表示现在正在处理事件的HTML元素。
element.addEventListener('click',doSomething,false); 
another_element.addEventListener('click',doSomething,false); 
function doSomething() { 
this.style.backgroundColor = '#cc0000'; 
}

如果你把doSomething()注册在任意一个HTML元素的click实践上,那么当用户点击的时候这个元素的背景就会变成红色。

哪个事件处理程序被注册了呢?
现在这个W3C事件注册模式有一个问题就是你不知道一个元素都有哪些事件处理程序被注册了。在传统模式下面你可以:
alert(element.onclick)
你就可以看到哪些函数注册了,undefined就是没有函数注册在这个事件上。只是在最近的DOM Level 3事件中W3C才添加了一个eventListenerList来存储已经注册了的事件处理程序。因为太新了,鲜有浏览器支持。然而,问题已经解决了。
还好的是removeEventListener()不会因为你没有注册元素的某个事件而返回错误,所以你可以不用担心的使用removeEventLister()。
微软
微软也有一个事件注册模型。跟W3C的很像,但是有一个严重的缺陷。
注册一个事件处理程序,attach到一个元素:
element.attachEvent('onclick',doSomething)
或者,你需要两个事件处理程序:
element.attachEvent('onclick',startDragDrop)
element.attachEvent('onclick',spyOnUser)
移除一个也非常简单:
element.detachEvent('onclick',spyOnUser)

缺陷
跟W3C的相比较,微软有两个严重的问题:
、事件总是冒泡,没有被捕捉的可能。
、事件处理程序是被引用的,而不是拷贝的,所以this关键字总是指向window然后就一点用都没有。
这两个问题的结果就是如果一个事件冒泡了那么你是没有可能知道哪个元素在处理事件。在后面的事件顺序一章我会详细的解释。
而且微软的标准只被IE支持,也不能用来跨浏览器。就算你只是给windows浏览器写脚本也最好别用,因为冒泡问题会让事情变得不可收拾。
继续
如果你想继续学习,请看下一章。
原文地址:http://www.quirksmode.org/js/events_advanced.html
第一次翻译 大家多多包含 我的twitter:@rehawk

Javascript 相关文章推荐
Jquery在IE7下无法使用 $.ajax解决方法
Nov 11 Javascript
基于Jquery的开发个代阴影的对话框效果代码
Jul 28 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
May 10 Javascript
JavaScript对象和字串之间的转换实例探讨
Apr 21 Javascript
JavaScript的21条基本知识点
Mar 04 Javascript
js图片延迟技术一般的思路与示例
Mar 20 Javascript
JS对img标签进行优化使用onerror显示默认图像
Apr 24 Javascript
jQuery获取动态生成的元素示例
Jun 15 Javascript
JavaScript Function函数类型介绍
Apr 08 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
Sep 05 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
Nov 11 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
Nov 20 Javascript
JavaScript Event学习第四章 传统的事件注册模型
Feb 07 #Javascript
JavaScript Event学习第三章 早期的事件处理程序
Feb 07 #Javascript
JavaScript Event学习第二章 Event浏览器兼容性
Feb 07 #Javascript
JavaScript Event事件学习第一章 Event介绍
Feb 07 #Javascript
jQuery库与其他JS库冲突的解决办法
Feb 07 #Javascript
jQuery学习7 操作JavaScript对象和集合的函数
Feb 07 #Javascript
jQuery 学习6 操纵元素显示效果的函数
Feb 07 #Javascript
You might like
javascript 小型动画组件与实现代码
2010/06/02 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
Node.js实现兼容IE789的文件上传进度条
2016/09/02 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
原生js获取left值和top值的三种方法
2017/08/02 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
Vue自定义指令写法与个人理解
2019/02/09 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
python正则实现计算器功能
2017/12/14 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
详解python3中的真值测试
2018/08/13 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
python面向对象 反射原理解析
2019/08/12 Python
使用python实现名片管理系统
2020/06/18 Python
Ajax实现页面无刷新留言效果
2021/03/24 Javascript
环保公益广告语
2014/03/13 职场文书
就业意向书范文
2014/04/01 职场文书
内勤岗位职责范本
2015/04/13 职场文书
企业承诺书格式范文
2015/04/28 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python