JavaScript 获取事件对象的注意点


Posted in Javascript onJuly 29, 2009

平时我们获取事件对象一般写法如下:

function getEvent(event) { 
return event || window.event // IE:window.event 
}

如果没有参数,也可写成(非IE :事件对象会自动传递给对应的事件处理函数,且为第一个参数):
function getEvent() { 
return arguments[0] || window.event // IE:window.event 
}

这样的写法在除 Firefox(测试版本:3.0.12,下同) 外的浏览器上运行都不会有问题,但 Firefox 为什么例外呢?让我们这样一种情形:
<button id="btn" onclick="foo()">按钮</button> 
<script> 
function foo(){ 
var e = getEvent(); 
alert(e);} 
</script>

运行结果在 Firefox 中是 undefined,为什么呢?
在 Firefox 中调用其实是这样的,先调用执行的是:
function onclick(event) { 
foo(); 
}

然后调用执行的是:
function foo(){ 
var e = getEvent(); 
alert(e); 
}

会发现在 Firefox 下 onclick="foo()" 中的 foo() 无法自动传入事件对象参数,而默认传递给了系统生成的 onclick 函数,那本例我们可以通过getEvent.caller.caller.arguments[0] 获得事件对象。
因此,我们的 getEvent 可以优化成(参照 yui_2.7.0b 中的 event/event-debug.js 中 getEvent 方法):
function getEvent(event) { 
var ev = event || window.event; 
if (!ev) { 
var c = this.getEvent.caller; 
while (c) { 
ev = c.arguments[0]; 
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { /怿飞注:YUI 源码 BUG,ev.constructor 也可能是 MouseEvent,不一定是 Event 
break; 
} 
c = c.caller; 
} 
} 
return ev; 
}

当然还有一个很简单的解决方法,就是手动将参数传递给 onclick="foo()":
<button id="btn" onclick="foo(event)">按钮</button>

Javascript 相关文章推荐
一个多次搜索+多次传值的解决方案
Jan 20 Javascript
javascript innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
Nov 04 Javascript
浅谈javascript六种数据类型以及特殊注意点
Dec 20 Javascript
node.js中的socket.io的广播消息
Dec 15 Javascript
Bootstrap每天必学之导航
Nov 26 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
jQuery实现选项卡功能(两种方法)
Mar 08 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
Nov 14 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
JS通过位运算实现权限加解密
Aug 14 Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 Javascript
javascript CSS画图之基础篇
Jul 29 #Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
Jul 29 #Javascript
JavaScript 设计模式学习 Factory
Jul 29 #Javascript
JQuery UI皮肤定制
Jul 27 #Javascript
JavaScript 设计模式学习 Singleton
Jul 27 #Javascript
xml 封装与解析(javascript和C#中)
Jul 26 #Javascript
JavaScript 捕获窗口关闭事件
Jul 26 #Javascript
You might like
php中的观察者模式
2010/03/24 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
Python基类函数的重载与调用实例分析
2015/01/12 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
python实现各进制转换的总结大全
2017/06/18 Python
Scrapy的简单使用教程
2017/10/24 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
python模块常用用法实例详解
2019/10/17 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
免税水晶:Duty Free Crystal
2019/05/13 全球购物
几个MySql的面试题
2013/04/22 面试题
护理职业生涯规划书
2014/01/24 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
PHP中->和=>的意思
2021/03/31 PHP