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 相关文章推荐
jQuery 判断页面元素是否存在的代码
Aug 14 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
Apr 12 Javascript
JS控制弹出新页面窗口位置和大小的方法
Mar 02 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
Nov 04 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
Angular通过angular-cli来搭建web前端项目的方法
Jul 27 Javascript
vue.js 获取select中的value实例
Mar 01 Javascript
Node.js进阶之核心模块https入门
May 23 Javascript
使用JS获取页面上的所有标签
Oct 18 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
为react组件库添加typescript类型提示的方法
Jun 15 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
php学习之function的用法
2012/07/14 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
js捆绑TypeScript声明文件的方法教程
2018/04/13 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python性能优化的20条建议
2014/10/25 Python
Python3 replace()函数使用方法
2018/03/19 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
Python urllib3软件包的使用说明
2020/11/18 Python
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
工作中个人的自我评价
2013/12/31 职场文书
物业工作计划书
2014/01/10 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
教师工作决心书
2015/02/04 职场文书
英文导游词
2015/02/13 职场文书
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server