-1

在我们的应用程序中,我们试图通过变量作用域来捕获所有 ajax 调用的 e(事件)。例如:

function whatever (e) {
        stuff();
}

function stuff() {
        thingy();
} 

function thingy() {
        // I have access to e
}

如果不将 e thru 作为参数传递,子函数应该可以访问其父事件。它在 chrome 和 IE 中工作,但在 firefox 中不工作,e 在 firefox 中始终未定义。我们不想在我们的应用程序中通过数百个 ajax 调用并将 e 作为参数传递到每个位置以使其工作。还有其他方法吗?

4

3 回答 3

1

不可以。该参数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 实现选择,在任何地方都是一样的。

如果您的特定代码恰好在其他一些浏览器中工作,那么显然有一个名为的全局变量ee在它正在拾取的其他父上下文中,并且恰好在其中具有正确的值,但事实并非e如此来自你的whatever(e)声明。无论如何,依赖这种隐含的行为是不好的。

如果您希望参数 e 可用于其他两个函数,那么您有两个不错的选择:

  1. 将其作为参数传递给他们。
  2. 在范围内定义这些函数,whatever(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));   
        });
    }
}
于 2012-08-31T17:38:01.140 回答
0

jfriend00 关于它不是 Firefox 并不是 100% 正确的。它实际上与Firefox有关。在 chrome 和 IE 中,事件可以通过名称全局访问(只要您知道事件的名称)。但是,firefox 处理事件的方式与 ie/chrome 不同。除了通过函数链将事件作为参数传递之外,我不知道还有其他解决方案。

于 2012-08-31T19:17:03.687 回答
0

jsfiddle.net/LU4yT/2 这个 jsfiddle 链接显然有不同的结果,具体取决于您使用的浏览器所以,我想说这个问题是特定于浏览器的......虽然我可能不得不同意 jfriend00 虽然你可以访问全局事件将事件作为参数传递会更好(尽管会占用更多内存)。

于 2012-08-31T19:21:21.717 回答