如何确保我的jQuery .ready最终运行

时间:2011-11-02 14:38:39

标签: jquery asp.net-mvc-2

我有一个使用母版页的MVC 2 Web应用程序。在母版页中,有几个就绪块,就像下面分散在整个文件中的那样

$(document).ready(function () {
   ...
});

同样,我的许多观点也有分散的多个现成块。

我被要求将另一个准备好的块引入到最后运行的Master中。

我的问题是“有没有办法保证这个新的就绪块能够最后运行?”。我的想法是,如果我把它放在Master页面的最底部就能做到,但我似乎无法让自己相信这是肯定的。

3 个答案:

答案 0 :(得分:5)

这是jQuery的.add方法,用于将$(document).ready()的回调推送到所有回调列表中:

add = function( args ) {
    var i, length, elem, type, actual;
    for ( i = 0, length = args.length; i < length; i++ ) {
        elem = args[ i ];
        type = jQuery.type( elem );
        if ( type === "array" ) {
            // Inspect recursively
            add( elem );
        } else if ( type === "function" ) {
            // Add if not in unique mode and callback is not in
            if ( !flags.unique || !self.has( elem ) ) {
                list.push( elem );
            }
        }
    }
}

来源:jQuery's callback

所以:它基本上做的是推动list数组中的所有函数,并在事件被触发后 - 以相同的顺序调用它们,如果你的函数被推送到最后 - 它将被调用到最后

要将其推送到最后,您可以在包含所有其他.js文件之后将其声明 (只需确保下面没有任何其他$(document).ready()

答案 1 :(得分:1)

这是我使用的技巧。在母版页中,声明

var postReadyEvents = [];

然后,在子页面中,当您有一些需要最后运行的代码时,请执行

postReadyEvents.push(function() {
    ///your stuff - I usually use this to resize a grid or something.
});

现在,在Master Page $(document).ready()中,执行

for(var i = 0; i < postReadyEvents.length; i++)
{
    postReadyEvents[i]();
}

如果在子页面和母版页上都有$(document).ready(),则子页面将首先运行,而母版页最后运行。这种方法使您能够控制某段代码运行的时间。

答案 2 :(得分:0)

我想你可以在这里做一些小动作。 因为我不知道应该适合您的解决方案的确切情况,我建议您通过

添加延迟

window.setTimeout( 在这里打电话给你的cuntion ,*延迟时间,以毫秒为单位*);

我知道这不是那么优雅,但这就是我的想法,请告诉我这是否对你有所帮助,谢谢。