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
  • asp之家 网络编程 m.aspxhome.com