JavaScript获取事件对象的注意点
作者:blank 来源:蓝色理想 时间:2009-07-29 18:36:00
平时我们获取事件对象一般写法如下:
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,事件,对象
0
投稿
猜你喜欢
MySQL Community Server 8.0.29安装配置方法图文教程
2024-01-22 12:02:55
Python中使用sklearn进行特征降维的方法
2021-09-20 06:23:50
uniapp组件uni-popup弹出层的使用
2024-04-28 09:47:55
MySql创建分区的方法实例
2024-01-23 22:17:40
js拖拽效果的原理及实现
2024-04-10 10:43:29
用JMail、CDONTS发送邮件asp源码
2007-09-24 15:58:00
Go Generate 代替 Makefile使用方法详解
2024-04-27 15:28:18
oracle执行cmd的实现方法
2009-04-24 12:10:00
正在研究XMLHTTP如何正确传送大于7F(127)的二进制数据
2008-09-13 18:41:00
AJAX初体验之上手篇
2007-08-23 08:50:00
帮助你分析MySQL的数据类型以及建库策略
2009-02-23 17:39:00
Django压缩静态文件的实现方法详析
2023-06-15 05:31:33
mysql中的Load data的使用方法
2024-01-13 22:37:56
java使用正则表达式查找包含的字符串示例
2022-06-18 21:02:08
vue项目中将element-ui table表格写成组件的实现代码
2024-05-28 15:55:31
浅谈JavaScript Date日期和时间对象
2024-05-03 15:58:01
Web标准学习:CSS样式书写风格
2008-03-25 09:37:00
如何做一个只搜索本网站的引擎?
2010-07-12 19:02:00
Python 3.x 新特性及10大变化
2023-02-05 09:17:36
使用python检查yaml配置文件是否符合要求
2021-06-23 05:27:53