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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
JQuery优缺点分析说明
Apr 10 Javascript
JS构建页面的DOM节点结构的实现代码
Dec 09 Javascript
jQuery中的val()示例应用
Feb 26 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
May 04 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
利用angular、react和vue实现相同的面试题组件
Feb 19 Javascript
React BootStrap用户体验框架快速上手
Mar 06 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
Sep 05 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
Oct 11 Javascript
React学习之受控组件与数据共享实例分析
Jan 06 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
Feb 23 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数组总结篇(一)
2008/09/30 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
python 中random模块的常用方法总结
2017/07/08 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
python 利用zmail库发送邮件
2020/09/11 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
.net面试题
2016/09/17 面试题
几个常见的软件测试问题
2016/09/07 面试题
网络教育毕业生自我鉴定
2013/10/10 职场文书
医学专业毕业生推荐信
2013/11/14 职场文书
四议两公开实施方案
2014/03/28 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
银行自荐信怎么写
2015/03/05 职场文书