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

时间:2011-05-01 15:34:30

标签: javascript jquery events object

我的链接上有onclick属性:

<a href="#" onclick="myFunc(1,2,3)">click</a>

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

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

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

我尝试了window.event$(window.event),但都是undefined

有什么想法吗?

4 个答案:

答案 0 :(得分:89)

  

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

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

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

<a href="#" onclick="myFunc(event, 1,2,3)">click</a>

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

但您的最佳赌注是使用现代事件处理:

HTML:

<a href="#">click</a>

使用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();
});

...或者如果你真的想将event传递给myFunc

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

选择器可以是标识锚点的任何东西。你有very rich set可供选择(几乎所有的CSS3,加上一些)。您可以向锚点添加idclass,但您还可以选择其他选项。如果你可以使用它在文档中的位置而不是添加一些人工的东西,那就太好了。

答案 1 :(得分: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];
}

答案 2 :(得分:3)

写下你的事件处理程序声明:

<a href="#" onclick="myFunc(event,1,2,3)">click</a>

然后你的“myFunc()”函数可以访问该事件。

“onclick”属性的字符串值以与浏览器(内部)调用Function构造函数几乎完全相同的方式转换为函数:

theAnchor.onclick = new Function("event", theOnclickString);

(IE除外)。但是,因为“event”是IE中的全局(它是一个窗口属性),所以你可以在任何浏览器中将它传递给该函数。

答案 3 :(得分:1)

如果你在标记上调用事件处理程序,就像你现在所做的那样,你不能(x-browser)。 但是如果使用jquery绑定click事件,可以采用以下方式:

标记:

  <a href="#" id="link1" >click</a>

使用Javascript:

  $(document).ready(function(){
      $("#link1").click(clickWithEvent);  //Bind the click event to the link
  });
  function clickWithEvent(evt){
     myFunc('p1', 'p2', 'p3');
     function myFunc(p1,p2,p3){  //Defined as local function, but has access to evt
        alert(evt.type);        
     }
  }

自事件ob