我有一个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
。
任何想法?
由于事件对象"evt"没有从参数传递,是否仍然有可能获得该对象?
不,不可靠。IE和其他一些浏览器提供window.event
(而不是$(window.event)
),但这是非标准的,并不是所有浏览器都支持(众所周知,Firefox不支持)。
你最好将事件对象传递给函数:
<a href="#" onclick="myFunc(event, 1,2,3)">click</a>
这甚至适用于非IE浏览器,因为它们在具有event
变量的上下文中执行代码(并且适用于IE,因为event
解析为window.event
)。我在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);
});
选择器可以是任何标识锚的东西。你有一个非常丰富的选择(几乎所有的CSS3,加上一些)。您可以向锚添加id
或class
,但是您还有其他选择。如果你能在文档中使用它,而不是添加一些人为的东西,那就太好了。
在IE中可以通过window.event
获取事件对象在其他没有'use strict'
指令的浏览器中,可以通过arguments.callee.caller.arguments[0]
获取。
function myFunc(p1, p2, p3) {
var evt = window.event || arguments.callee.caller.arguments[0];
}
像这样编写事件处理程序声明:
<a href="#" onclick="myFunc(event,1,2,3)">click</a>
然后你的"myFunc()"函数可以访问事件。
"onclick"属性的字符串值被转换为函数的方式与浏览器(内部)调用function构造函数的方式几乎完全相同:
theAnchor.onclick = new Function("event", theOnclickString);
(IE除外)。然而,因为"event"在IE中是全局的(它是一个窗口属性),你可以在任何浏览器中以这种方式传递它给函数。
如果像现在这样在标记上调用事件处理程序,则不能(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