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 相关文章推荐
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
Aug 21 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
Nov 30 Javascript
判断访客终端类型集锦
Jun 05 Javascript
灵活的理解JavaScript中的this指向
Feb 25 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
Jun 26 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
Jul 07 Javascript
利用node.js爬取指定排名网站的JS引用库详解
Jul 25 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
Sep 22 Javascript
js+html5实现手机九宫格密码解锁功能
Jul 30 Javascript
微信小程序显示倒计时功能示例【测试可用】
Dec 03 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
实例讲解PHP面向对象之多态
2014/08/20 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
JQuery select标签操作代码段
2010/05/16 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
图解Python变量与赋值
2018/04/03 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
高级方案规划工程师岗位职责
2013/11/29 职场文书
面试后感谢信
2014/02/01 职场文书
志愿者活动总结报告
2014/06/27 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
golang正则之命名分组方式
2021/04/25 Golang
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers