必须在同一个脚本中多次使用$(document).ready()

时间:2012-11-03 19:32:05

标签: javascript jquery scope document ready

我有一个具有以下结构的脚本:

Test = {

    CONSTANTS : {},
    VARIABLES : {},
    MARKUP : {},
    FUNCTIONS : {
        init : function () {

            // Access variable from different namespace
            var all_constants = DifferentNamespace.CONSTANTS; // WORKS
            var tester = DifferentNamespace.CONSTANTS.chunk_of_markup; // SAYS UNDEFINED
        }
    },
    init : function () {

        // Call real init() function

        $(document).ready(function () {

            Test.FUNCTIONS.init();
        });
    }

};

$(document).ready(function () {

    Test.init();
});

如果我删除$(document).ready(..)函数调用中的任何一个,当我尝试从不同的命名空间访问常量时,它是未定义的;两者都运作良好。

正如您所看到的,我正在使用两个init()函数,只是为了将对init的调用结束,因为我已将函数包装在另一个对象中。

如果我删除与CONSTANTS,VARIABLES等处于同一级别的函数并尝试在Test.FUNCTIONS中调用init(),它仍然无效。

编辑:

如果我console.log(all_constants)我获得了完整的对象(使用.chunk_of_markup),但是如果我console.log(tester)获得undefined。如果我包裹测试人员我得到[]

我还应该注意,另一个命名空间从单独的文件中获取标记。

任何想法为什么?

2 个答案:

答案 0 :(得分:1)

准备两份文件并没有什么不同。你可以有一个document.ready和/或直接调用Test.FUNCTIONS.init,所有这些都应该有效,而且它们在不同的命名空间中的事实并不重要。

至于你未定义的原因,我认为这可能是因为你的 chunk_of_markup 变量实际上是 undefined 。我的猜测是你通过AJAX得到它的值,因此调用是异步完成的,这意味着DOM在它实际返回一个值之前就已经准备好了。当您使用调试器时,在运行命令的时间点评估该值,那么异步调用已经成功返回(这是一个竞争条件,如果你足够快并且你的AJAX很慢那么你可以仍然得到未定义,这也是为什么2个就绪函数恰好让它足够慢以便AJAX调用返回但它仍然不可靠的原因)。

在所有情况下,如果我的理论是正确的,那么你需要挂钩AJAX请求的回调而不是DOM就绪事件,这是你可以保证你的变量被定义的唯一地方。

答案 1 :(得分:0)

为什么不在文档处理程序本身中调用function init() ..我认为这不会导致同样的问题。您可以完全删除Test.init(),因为它似乎没有这里有什么

Test = {
    CONSTANTS : {},
    VARIABLES : {},
    MARKUP : {},
    FUNCTIONS : {
        init : function () {

            // Access variable from different namespace
            var all_constants = DifferentNamespace.CONSTANTS; // WORKS
            var tester = DifferentNamespace.CONSTANTS.chunk_of_markup; // SAYS UNDEFINED
        }
    }
};

$(document).ready(function () {

    Test.FUNCTIONS.init();
});