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 相关文章推荐
js表数据排序 sort table data
Feb 18 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
Apr 10 Javascript
JS实现方向键切换输入框焦点的方法
Aug 19 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
Sep 22 Javascript
jQuery简单实现列表隐藏和显示效果示例
Sep 12 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
Jun 08 Javascript
一起写一个即插即用的Vue Loading插件实现
Oct 31 Javascript
JS中的模糊查询功能
Dec 08 Javascript
nuxt 实现在其它js文件中使用store的方式
Nov 05 Javascript
详解JavaScript 中的批处理和缓存
Nov 19 Javascript
JavaScript实现通讯录功能
Dec 27 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
PHP4之COOKIE支持详解
2006/10/09 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
2016/05/05 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
浅析Python函数式编程
2018/10/06 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
放飞梦想演讲稿200字
2014/08/26 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
三八妇女节标语
2014/10/09 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js