Firefox中的Javascript事件范围问题?

时间:2012-08-31 17:35:06

标签: javascript events firefox

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

function whatever (e) {
        stuff();
}

function stuff() {
        thingy();
} 

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

如果没有作为参数传递,则子函数应该可以访问其父事件。它在chrome和IE中工作,但在firefox中没有,e在firefox中总是未定义。我们不希望在我们的应用程序中通过数百个ajax调用,并在每个地方传递e作为参数来实现。还有其他办法吗?

3 个答案:

答案 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实现选择,它在任何地方都是一样的。

如果您的特定代码恰好在其他浏览器中运行,那么显然在某个其他父上下文中有一个名为ee的全局变量,它正在拾取并且恰好发生在它具有正确的价值,但不是e来自whatever(e)级别的whatever(e)。无论如何,依靠这种隐含的行为是不好的。

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

  1. 将它作为参数传递给他们。
  2. .addEventListener()范围内定义这些函数,以便他们可以直接查看参数。

  3. 如果您真正想要做的是访问事件处理程序中发生的事件,那么您真的只需要知道这一点:

    如果您正在使用.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,虽然您可以访问全局事件将事件作为参数传递更好(尽管需要更多内存)。