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 相关文章推荐
javascript中最常用的继承模式 组合继承
Aug 12 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
Nov 30 Javascript
禁止你的左键复制实用技巧
Jan 04 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
jQuery中height()方法用法实例
Dec 24 Javascript
JavaScript按值删除数组元素的方法
Apr 24 Javascript
JavaScript 模块的循环加载实现方法
Dec 13 Javascript
基于JavaScript代码实现自动生成表格
Jun 15 Javascript
Vue组件实例间的直接访问实现代码
Aug 20 Javascript
angularjs实现table增加tr的方法
Feb 27 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
Sep 30 Javascript
vsCode安装使用教程和插件安装方法
Aug 24 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 mvc开发模式的感想
2011/06/28 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
比较完整的微信开发php代码
2016/08/02 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
python抓取网页图片并放到指定文件夹
2014/04/24 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
PyTorch安装与基本使用详解
2020/08/31 Python
python 实现表情识别
2020/11/21 Python
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
2014大学班主任工作总结
2014/11/08 职场文书
2015年质检工作总结
2015/05/04 职场文书
浅析Python OpenCV三种滤镜效果
2022/04/11 Python
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电
Python实现双向链表
2022/05/25 Python