在我们的应用程序中,我们试图通过变量范围来捕获所有ajax调用的e(事件)。例如:
function whatever (e) {
stuff();
}
function stuff() {
thingy();
}
function thingy() {
// I have access to e
}
如果没有作为参数传递,则子函数应该可以访问其父事件。它在chrome和IE中工作,但在firefox中没有,e在firefox中总是未定义。我们不希望在我们的应用程序中通过数百个ajax调用,并在每个地方传递e作为参数来实现。还有其他办法吗?
答案 0 :(得分:1)
没有。 arugment e
仅适用于whatever()
内部直接定义的代码或您传递引用的任何函数。除非您将其传递给它们,否则它不会在whatever()
内调用的函数中使用。
以下是您所提问题中代码的确切实现,但在所有浏览器中都失败:http://jsfiddle.net/jfriend00/ReNKU/
对于解决方案,您可以使用本地函数,然后e
可用于您的其他两个函数,因为它们是在whatever()
的范围内定义的:
function whatever (e) {
function stuff() {
// e is available here
thingy();
}
function thingy() {
// e is available here
}
// e is available here
stuff();
}
或者,您可以将其作为参数传递给每个原始函数:
function whatever (e) {
stuff(e);
}
function stuff(e) {
thingy(e);
}
function thingy(e) {
}
关于函数参数可用的这个问题与Firefox无关,因为这是一个javascript实现选择,它在任何地方都是一样的。
如果您的特定代码恰好在其他浏览器中运行,那么显然在某个其他父上下文中有一个名为e
或e
的全局变量,它正在拾取并且恰好发生在它具有正确的价值,但不是e
来自whatever(e)
级别的whatever(e)
。无论如何,依靠这种隐含的行为是不好的。
如果您希望参数e可用于其他两个函数,那么您有两个不错的选择:
.addEventListener()
范围内定义这些函数,以便他们可以直接查看参数。如果您真正想要做的是访问事件处理程序中发生的事件,那么您真的只需要知道这一点:
如果您正在使用.addEventListener()
,则事件数据结构将作为第一个参数传递给事件处理程序。在支持包含IE9的.attachEvent()
的所有浏览器中都是如此。如果您在旧版本的IE中使用window.event
,那么事件数据结构位于全局变量// add event cross browser
function addEvent(elem, event, fn) {
if (elem.addEventListener) {
elem.addEventListener(event, fn, false);
} else {
elem.attachEvent("on" + event, function() {
// set the this pointer same as addEventListener when fn is called
// and get the event data structure from the global variable and
// pass it to the event handler
return(fn.call(elem, window.event));
});
}
}
中,您可以在那里访问它。一个事件处理程序启动,如果你想让这个数据结构可用于你调用的其他函数,你应该将它作为参数传递给它们。然后,他们的行为完全是浏览器安全的。
这是一个快速的跨浏览器事件注册功能,它还处理事件差异:
{{1}}
答案 1 :(得分:0)
jfriend00不是100%正确的关于它不是firefox。它实际上与firefox有关。在chrome和IE中,可以通过名称全局访问事件(只要您知道事件的名称)。但是,firefox处理事件的方式与ie / chrome不同。我不知道除了通过函数链作为参数传递事件之外还有一个解决方案。
答案 2 :(得分:0)
jsfiddle.net/LU4yT/2这个jsfiddle链接显然有不同的结果,具体取决于您使用的浏览器,我会说问题是浏览器特定的...虽然我可能不得不同意jfriend00,虽然您可以访问全局事件将事件作为参数传递更好(尽管需要更多内存)。