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 判断客户端浏览器类型代码
Mar 01 Javascript
jquery easyui的tabs使用时的问题
Mar 23 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
Jun 29 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
JavaScript比较两个对象是否相等的方法
Feb 06 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
Mar 03 Javascript
ES6学习教程之块级作用域详解
Oct 09 Javascript
Angular resolve基础用法详解
Oct 03 Javascript
支付宝小程序tabbar底部导航
Nov 06 Javascript
JavaScript 反射和属性赋值实例解析
Oct 28 Javascript
高性能js数组去重(12种方法,史上最全)
Dec 21 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防止恶意刷新与刷票的方法
2014/11/21 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
jquery实现直播视频弹幕效果
2020/02/25 jQuery
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
实例讲解python函数式编程
2014/06/09 Python
python如何修改装饰器中参数
2018/03/20 Python
Python内存读写操作示例
2018/07/18 Python
python 用下标截取字符串的实例
2018/12/25 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
保密工作实施方案
2014/02/24 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
党的群众路线调研报告
2014/11/03 职场文书
工资证明范本
2015/06/12 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python