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 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
Jan 15 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
jQuery中remove()方法用法实例
Dec 25 Javascript
JavaScript阻止浏览器返回按钮的方法
Mar 18 Javascript
javascript连续赋值问题
Jul 08 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
Dec 10 Javascript
javascript实现下拉提示选择框
Dec 29 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
Jan 14 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
May 10 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
Sep 14 Javascript
vue ssr 指南详读
Jun 29 Javascript
angularjs 的数据绑定实现原理
Jul 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中的foreach问题
2013/06/30 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
php实现插入排序
2015/03/29 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
怎么清空javascript数组
2013/05/11 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
详解django模板与vue.js冲突问题
2019/07/07 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
Python实现修改文件内容的方法分析
2018/03/25 Python
python实现网页自动签到功能
2019/01/21 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python实现大文件分割与合并
2019/07/22 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
在python中求分布函数相关的包实例
2020/04/15 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
办公室主任主任岗位责任制
2014/02/11 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
诚实守信演讲稿
2014/09/01 职场文书
护士工作失误检讨书
2014/09/14 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
行为规范主题班会
2015/08/13 职场文书