浅谈Javascript中的事件流和事件绑定(3)
作者:姚海啸 来源:Yaohaixiao博客 发布时间:2009-07-20 17:13:00
What is ‘this’?
IE在前面给了我“惊喜”,this也给我惊喜。当然主要是我以前没有注意到,但是YAHOO的工程师们早以发现了。this这个关键字是根据上下文来决定的,在我们的事件绑定的功能函数里,this应该是指向当前的元素节点对象,应该是一个Element对象。我想这个大家应该好理解:
示例代码:
<span id="cnt0">
<a href=”#1″ id=”link0″>点击我触发捕获型事件流</a>
</span>
<script type=”text/javascript”>
var link = document.getElementById(’link1′);
link.onclick = function(){
alert(this.tagName);
};
</script>
这段代码正式我在示例(1)中的处理方式,示例中this指向的a标签这个element对象,所以我们可以得到a标签的tagName这个属性‘A’。示例(2)里,我使用一个兼容的事件监听函数:
function addListener(el, event, fn, bCapture){
var isCapture = bCapture ? bCapture : false;
try {
el.addEventListener(event, fn, isCapture);
}
catch (e) {
try {
el.attachEvent(’on’ + event, fn);
}
catch (e) {
el['on' + event] = fn;
}
}
}
在我们的支持DOM事件流的浏览器里,我们也可以得到正确的提示this.tagName为‘A’。this出现问题就在IE中,当我们使用attachEvent给元素绑定事件,现在你点击下面的链接:
示例(3)
示例代码:
<span id=”cnt2″>
<a href=”#1″ id=”link2″>What is ‘this’?</a>
</span>
function whatIsThis(){
if (this === window) {
alert(’This is a window object’);
}
alert(’So, This.tagName is:’+ ‘‘’+ this.tagName +’’。’);
}
<script type=”text/javascript”>
var cntThree = document.getElementById(’cnt2′), lnkThree = document.getElementById(’link2′);
addListener(lnkThree, ‘click’, whatIsThis);
addListener(cntThree, ‘click’, whatIsThis);
</script>
看清楚了吗?如果你在IE6~8中测试,那么你点的是window对象而不是一个a标签。晕倒!!!-_-! 所以你要小心,问题多多啊,要解决这个this关键字的问题,我给你的建议就是你可以考虑直接用传统的’onclick’或者修改下前面的绑定事件监听的函数:
修改后的代码:
function addEvent(el, event, fn, obj, overrideContext, bCapture){
var context = el, isCapture = bCapture ? bCapture : false, wrappedFn = null;
if (overrideContext) {
if (overrideContext === true) {
context = obj;
}
else {
context = overrideContext;
}
}
wrappedFn = function(){
return fn.call(context);
};
try {
el.addEventListener(event, wrappedFn, isCapture);
}
catch (e) {
try {
el.attachEvent(’on’ + event, wrappedFn);
}
catch (e) {
el['on' + event] = wrappedFn;
}
}
}
好了就这么多了,不知道对你有没有帮助,最后说明下,本文中的部分观点参考至《Javascript高级程序设计》(很好的一本书,推荐大家看看!),addEvent函数借鉴了YUI2.7的_addListener方法,这里也要谢谢YUI那些牛人,向他们致敬!
演示:http://www.yaohaixiao.com/my/event/index.html
(请用IE6访问,点击第一个示例链接,但千万不要用Firefox,否则会挂掉)


猜你喜欢
- 前言Django 和 DRF(django rest framawork) 的结合在 python 后台中经常出现的组合。对于异常的全局处理
- 现在同类型的网站数不胜数,网站的功能或服务日趋同质化,大的方面看不出什么差别,差别就体现在细节上。“窥斑见豹”,细节成为网站最有力的表现形式
- 数据库访问是程序中应用最普遍的部分。随着C#和ADO.NET的引入,这种操作变得更简单。这篇文章将示范四种最基础的数据库操作。
- asp如何用Jmail的发送电子邮件?asp源码见下:<% Set mail1
- 我们在做诸如人群密集度等可视化的时候,可能会考虑使用热力图,在Python中能很方便地绘制热力图。下面以识别图片中的行人,并绘制热力图为例进
- 1 慢查询定义指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句。慢查询日志就是记录这些sql的日志。
- 表级锁该锁会锁定整张表,它是MySQL中最基本的锁策略,并不依赖于存储引擎(不管你是MySQL的什么存储引擎,对于表锁的策略都是一样的),并
- Scrapy是什么?先看官网上的说明,http://scrapy-chs.readthedocs.io/zh_CN/latest/intro
- MSSQL2000安全设置Sql server 2000建立独立帐号数据库方法首先我们启动Sql server 2000数据库,并打开企业管
- anaconda 集成了很多科学计算中所需要的包,如numpy,scipy等等,具体查看anaconda中已经预先安装配置好的包
- JavaScript 有三种弹窗 Alert (只有确定按钮), Confirmation (确定,取消等按钮), Prompt (有输入对
- 本文实例讲述了Python 函数用法。分享给大家供大家参考,具体如下:demo.py(函数定义):# say_hello() # 不能在定义
- 有一个表,用户需要在后台操作它,希望能对它动态进行添加删除字段。这个功能也许没有问题,但是它原有插入与更新的两个存储过程,也需要一起修改。因
- 目录搭建Vuex环境总结搭建Vuex环境在src目录下创建一个文件夹store,在store文件夹内创建一个index.js文件index.
- 一,用临时表作为数组 create function f_split(@c varchar(2000),@split varchar(2))
- 前言:上一篇文章详细介绍windows下MySQL安装教程,这篇就从最基本的安装MySQL-Linux环境开始,感兴趣的小伙伴可以关注我,系
- 一、实现双向绑定的做法前端MVVM最令人激动的就是双向绑定机制了,实现双向数据绑定的做法大致有如下三种:1.发布者-订阅者模式(backbo
- 不是炒冷饭,我添加了很多新的功能哦演示地址: xwinhtcdemo.htmCSS: global.cssHTC: xwin.htc特点:1
- 为什么要使用php缓存技术?理由很简单:提高效率。在程序开发中,获取信息的方式主要是查询数据库,除此以外,也可能是通过Web Service
- 通过锁机制,可以实现多线程同时对某个表进行操作。如下图所示,在某个时刻,用户甲、用户乙、用户丙可能会同时或者先后(前面一个作业还没有完成)对