jQuery:如何在事件处理函数中获取事件对象而不将其作为参数传递?

Laz*_*iko 67 javascript jquery events object

我的onclick链接有一个属性:

<a href="#" onclick="myFunc(1,2,3)">click</a>
Run Code Online (Sandbox Code Playgroud)

这指向JavaScript中的这个事件处理程序:

function myFunc(p1,p2,p3) {
    //need to refer to the current event object:
    alert(evt.type);        
}
Run Code Online (Sandbox Code Playgroud)

由于事件对象"evt"未传递给参数,是否仍然可以获取此对象?

我试过window.event$(window.event),但两者都是undefined.

任何的想法?

T.J*_*der 95

由于事件对象"evt"未从参数传递,是否仍然可以获取此对象?

不,不可靠.IE和其他一些浏览器使它可用window.event(不是$(window.event)),但这是非标准的,并不是所有浏览器都支持(着名的是Firefox不支持).

你最好将事件对象传递给函数:

<a href="#" onclick="myFunc(event, 1,2,3)">click</a>
Run Code Online (Sandbox Code Playgroud)

这甚至可以在非IE浏览器上运行,因为它们在具有event变量的上下文中执行代码(并且因为event解析而在IE 上工作window.event).我在IE6 +,Firefox,Chrome,Safari和Opera中尝试过它.示例:http://jsbin.com/iwifu4

最好的办法是使用现代事件处理:

HTML:

<a href="#">click</a>
Run Code Online (Sandbox Code Playgroud)

使用jQuery的JavaScript(因为你使用的是jQuery):

$("selector_for_the_anchor").click(function(event) {
    // Call `myFunc`
    myFunc(1, 2, 3);

    // Use `event` here at the event handler level, for instance
    event.stopPropagation();
});
Run Code Online (Sandbox Code Playgroud)

...或者,如果你真的想传递eventmyFunc:

$("selector_for_the_anchor").click(function(event) {
    myFunc(event, 1, 2, 3);
});
Run Code Online (Sandbox Code Playgroud)

选择器可以是标识锚点的任何东西.你有一个非常丰富的选择(几乎所有的CSS3,加上一些).您可以添加一个idclass到锚点,但同样,您还有其他选择.如果你可以使用它在文档中的位置,而不是添加一些人工的,伟大的.

  • 感谢您的解释,javascript的这一部分总是让我困惑.从无处传递这个看不见的,神秘的"事件"参数的想法从来没有被我解释过. (5认同)

ota*_*tay 14

在IE中你可以通过window.event 其他没有'use strict'指令的浏览器获取事件对象,它可以通过arguments.callee.caller.arguments[0].

function myFunc(p1, p2, p3) {
    var evt = window.event || arguments.callee.caller.arguments[0];
}
Run Code Online (Sandbox Code Playgroud)

  • `arguments.callee.caller`不是普遍支持的,在一些支持它的实现中速度非常慢,是一个*非常糟糕的主意,并且在严格模式下是不允许的. (6认同)