【问题标题】:First parameter to event handler事件处理程序的第一个参数
【发布时间】:2010-03-10 02:13:41
【问题描述】:

如果我在我的标记中注册了一些事件处理程序(我知道已弃用),例如

 span id="..." onclick="foo(p1,p2,p3)"

如何访问事件处理函数 foo 中的“事件”对象?将上述更改为

 span id="..." onclick="foo(event,p1,p2,p3)"

然后在“foo”中使用它

function foo(e,p1,p2,p3)
{
   if (!e) e = window.event;
}

似乎有效,但我没有在任何地方看到它的文档,所以我对使用它持谨慎态度。换句话说,inline 事件处理程序的 first 参数是否总是 event 对象 if 它被命名为例如在 onclick=... 标记中?这个跨浏览器是否可以安全使用?如果没有这样命名(如我的第一个示例中),参数将被视为常规参数并且不传递事件对象?

想法?谢谢

【问题讨论】:

    标签: javascript javascript-events


    【解决方案1】:

    您误解了您的代码。

    您放入内联处理程序的字符串是一段普通的 Javascript 代码。它不需要是单个函数调用;它甚至可以包含多个语句(像往常一样用分号分隔)

    内联处理程序中的代码将被赋予一个名为 event 的变量,该变量引用事件对象。

    当您编写onclick="foo(event,p1,p2,p3)" 时,您是在进行常规函数调用,并将名为eventp1p2p3 的四个变量的值作为参数传递给函数。

    【讨论】:

      【解决方案2】:

      看看here。这似乎与您的示例一致。但是,有人提到这在 IE 中的工作方式不同,因此您必须检查第一个参数(事件对象)是否已定义,如果未定义则使用 window.event。

      另一个参考here。我经常发现 MDC 很有帮助。

      【讨论】:

        【解决方案3】:

        好的,所以我在 Firefox (3.5.8/linux) 中运行了一些测试,这就是我想出的。我不知道在示例 2 中使用了“事件”,但它似乎在 Firefox 中可以正常工作。但是,传递给函数的第一个变量并非总是事件。 “事件”似乎注册在某个全局对象中,但我似乎无法确定是哪一个。 (不是文档,也不是窗口:P)

        你在 foo 函数中的那行代码

        if (!e) e = window.event;
        

        基本上是无论如何你必须在 Internet Explorer 中捕获事件的方式,所以它肯定会在 IE 和 Firefox 中工作。是的,因此,如果您没有像第二个示例那样传递一个名为“事件”的变量,则参数将被视为普通参数,并且不会传递事件对象。

        【讨论】:

          猜你喜欢
          • 2013-02-02
          • 1970-01-01
          • 2017-01-31
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多