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实现原理介绍)
Nov 08 Javascript
JS网页图片按比例自适应缩放实现方法
Jan 15 Javascript
js网页滚动条滚动事件实例分析
May 05 Javascript
JavaScript动态提示输入框输入字数的方法
Jul 27 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
Feb 19 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
Jan 15 Javascript
详解react-router4 异步加载路由两种方法
Sep 12 Javascript
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
Vue.set()实现数据动态响应的方法
Feb 07 Javascript
JavaScript Window窗口对象属性和使用方法
Jan 19 Javascript
可拖拽组件slider.js使用方法详解
Dec 04 Javascript
教你一步步实现一个简易promise
Nov 02 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中调用JAVA
2006/10/09 PHP
Snoopy类使用小例子
2008/04/15 PHP
隐性调用php程序的方法
2009/03/09 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
对于Python的Django框架部署的一些建议
2015/04/09 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python 创建一维的0向量实例
2019/12/02 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
荷兰超市:DEEN
2018/03/14 全球购物
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
社区工作者思想汇报
2014/01/13 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
室内拓展活动方案
2014/02/13 职场文书
捐书活动总结
2014/05/04 职场文书
个人承诺书格式
2014/06/03 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers