浅谈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,否则会挂掉)
猜你喜欢
- 前段时间我通过观察韩国网站和其他作品发现了普遍存在黄金分割这样一个规律,不过只跟色相有关,明度、纯度还没做研究,今天看到论坛一篇“网页配色之
- 分析当前用户下所有表的记录总数保证好用!begin dbms_utility.analyze_schema(user,'COMPUT
- 使用ENUM代替字符串类型有时候, 可以通过使用ENUM来代理常规的字符串类型。一个ENUM列能够存储65535个不同的字符串值,MySQL
- 有一编文章是用JavaScript对XML文件操作来实现无限级联动菜单的,我们可结合ASP来完成对数据库值的读取,然后写入XML文件,再用J
- aspjpeg组件实现加水印函数的调用方法: <%printwater "/images/水印图片.gif",&q
- css usage是一个基于firebug的firefox扩展,可以用来查看页面中的CSS的使用情况,可以清楚的查看css文件中所有的规则在
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 我是从去年初开始学习web标准的,两年下来也有些心得。最近跳槽了正好闲在家里,写一些出来和大家交流一下。1对于web标准和W3C XHTML
- ajax编程获取Google的PageRank3(PR值)及所在目录,想给你的站增加Google PR查询的功能吗?如果你不会就看看本文吧,
- 兼容IE6的第一步就是单独对IE进行兼容,你针对IE6所写的代码只影响IE6;有几种方法可以区分开IE6:IE特有条件注释、CSS选择器、J
- 2.彻底弄懂CSS盒子模式二(导航栏实例) 3.彻底弄懂CSS盒子模式三(浮动的表演和清除的自述) 4.彻底弄懂CSS盒子模式四(绝对定位和
- 今天看了微软JScript官方blog上去年的两篇文章: http://blogs.msdn.com/jscript/archive/200
- InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。下面是已知的两者之间的差别,仅供参考。1.Inn
- 到目前为止,我已经开发了两个HTML编辑器了,一个用在公司的CMS项目,另一个用在这个Blog(TidyEditor,暂时没有单独发布)。下
- 情景一: var yx01 = new function() {return "圆心"}; alert(yx01);我们
- 我们可用正规表达式来寻找并替换URL和邮件地址为活动的超级链接。用到的主要函数就是InsertHyperlinks(inText),语法为:
- asp之字符串函数示例用字符串函数对字符串进行截头去尾、大小写替换等操作。函数语 * 能LenLen(string|varname)返回字符串
- 为什么是三谈为什么是三谈呢?一是因为这真的是一个被说烂的话题,二是因为太师傅在n年前就写过这篇再谈iframe自适应高度。之所以再提该问题,
- 编写兼容IE和FireFox的脚本确定的件很烦人的事,今日又经历了一次。一、正式表达式问题试图用以下表达式提取中括号“]”后面的内容,连接调
- 程序编制 随着WEB的发展,与浏览者的交互越来越受到网站制作者的重视。现在的主页跟最初的静态主