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多项选项卡的实现思路附样式及代码
Jun 03 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
Feb 21 Javascript
jquery仿微信聊天界面
May 06 jQuery
vue组件watch属性实例讲解
Nov 07 Javascript
Nginx 配置多站点vhost 的方法
Jan 07 Javascript
前端axios下载excel文件(二进制)的处理方法
Jul 31 Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 Javascript
vue实现购物车抛物线小球动画效果的方法详解
Feb 13 Javascript
JS中比较两个Object数组是否相等方法实例
Nov 11 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
Nov 20 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
Dec 04 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
PHP7下协程的实现方法详解
2017/12/17 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
nodejs入门教程二:创建一个简单应用示例
2017/04/24 NodeJs
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
Apache如何部署django项目
2017/05/21 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
python中requests和https使用简单示例
2018/01/18 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
在求职信中如何凸显个人优势
2013/10/30 职场文书
任命书模板
2014/06/04 职场文书
简历自我评价优缺点
2015/03/11 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
2015年语文教学工作总结
2015/05/25 职场文书
毕业论文答辩开场白
2015/05/27 职场文书