事件处理程序的第一个参数

时间:2010-03-10 02:13:42

标签: javascript javascript-events

如果我有一些事件处理程序与我的标记内联注册(不推荐,我知道),如

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

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

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

然后在“foo”中使用它

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

似乎有效,但我没有在任何地方看到它,所以我很担心使用它。换句话说,内联事件处理程序的第一个参数始终是事件对象,如果它被命名为在onclick = ...标记?这个跨浏览器是否可以安全使用?如果没有这样命名(如我的第一个例子),参数被视为常规参数,并且不传递事件对象?

思考?感谢

3 个答案:

答案 0 :(得分:2)

你误解了你的代码。

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

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

当您编写onclick="foo(event,p1,p2,p3)"时,您正在进行常规函数调用,并传递名为eventp1p2和{{的四个变量的值1}}作为函数的参数。

答案 1 :(得分:0)

看看here。这似乎与你的例子一致。但是,有一些提到这在IE中的工作方式不同,所以你必须检查是否定义了第一个参数(事件对象),如果没有使用window.event。

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

答案 2 :(得分:0)

好的,所以我在Firefox(3.5.8 / linux)中运行了一些测试,这就是我想出来的。我没有意识到像事件2中那样使用“事件”,但它似乎在Firefox中正常工作。但是,传递给函数的第一个变量始终不是事件。 'event'似乎已在某个全局对象中注册,但我似乎无法确定哪一个。 (这不是文件或窗口:P)

foo函数中的代码行

if (!e) e = window.event;

基本上是你必须在Internet Explorer中捕获事件的方式,所以它肯定会在IE和Firefox中运行。是的,因此,如果你没有传递一个名为'event'的变量,就像在你的第二个例子中那样,参数将被视为普通参数,并且不会传递事件对象。