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 处理表单元素的代码
Feb 15 Javascript
23个Javascript弹出窗口特效整理
Feb 25 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
Mar 09 Javascript
JS中改变this指向的方法(call和apply、bind)
Mar 26 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
Aug 31 Javascript
js HTML5手机刮刮乐代码
Sep 29 Javascript
d3.js实现简单的网络拓扑图实例代码
Nov 06 Javascript
jQuery实现文章图片弹出放大效果
Apr 06 jQuery
jquery easyui如何实现格式化列
Jul 30 jQuery
webpack中如何使用雪碧图的示例代码
Nov 11 Javascript
使用post方法实现json往返传输数据的方法
Mar 30 Javascript
express启用https使用小记
May 21 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的无限分类实现想法~
2007/01/02 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
javascript 动态生成私有变量访问器
2009/12/06 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
python-视频分帧&amp;多帧合成视频实例
2019/12/10 Python
Staples美国官方网站:办公用品一站式采购
2016/07/28 全球购物
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
网站开发实习生的自我评价
2013/12/11 职场文书
五一促销活动总结
2014/07/01 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
企业工会工作总结2015
2015/05/13 职场文书
Python代码实现双链表
2022/05/25 Python