代码之家  ›  专栏  ›  技术社区  ›  Marcus Leon

确定所有初始化函数何时完成?

  •  1
  • Marcus Leon  · 技术社区  · 14 年前

    我们有一个JavaScript/JQuery页面,其中包含许多“初始化函数”a la:

    $(function(){
      //Do stuff
    }
    

    是否有一种编程方法可以确定所有这些方法何时都已完成运行?

    我们可以在最后一个函数()中将布尔变量设置为true。。。想知道有没有更优雅的方式。

    ??

    3 回复  |  直到 14 年前
        1
  •  2
  •   Nick Craver    14 年前

    如果你只是想确定他们是否逃跑了,用 $.isReady ,当DOM准备就绪时,它将是真的,直到执行所有处理程序之前才设置……所以基本上是单线程的特性将在那里工作。

    如果要对要执行的内容排队(必须排队 之前 document.ready 把它绑在 "ready" ,就像这样:

    $(document).bind("ready", function() { alert("All ready functions ran"); });
    

    You can see how it's fired here ,请注意,这是 一样 $(document).ready() , which is another function .

        2
  •  1
  •   cspolton Abbia    14 年前

    假设所有初始化“东西”都是同步的,您可以在页面上最后一个函数的末尾调用一个函数,在该函数中,您可以在知道所有东西都已初始化的情况下执行代码。

    $(function(){
      //Do stuff
    
      run();
    }
    
    function run() {
      // we are initialised now...
    }
    

    虽然这并不完全是您所要求的,但它消除了检查初始化功能是否已完成运行的需要。。。一旦他们有了 run 函数将被调用。

        3
  •  1
  •   andres descalzo    14 年前

    尝试 this (example) :

    HTML格式:

    <div id="test"></div>
    

    JS公司:

    (function ($) {
    
        var 
            owReady = $.ready,
            readyEndList = [];
    
        $.ready = function () {
    
            var 
                toEnd = owReady(),
                fn, i = 0;
    
            if (toEnd)
                return toEnd;
    
            if (!$.isReady)
                return toEnd; 
    
            while ( (fn = readyEndList[ i++ ]) ) {
                fn.call( document, jQuery );
            }
    
            readyEndList = null;
    
            return toEnd;
    
        };
    
        $.addToEndReady = function(fn) {
    
            if ($.isFunction(fn))
                readyEndList.push(fn);
        };
    
        $(function (ev) {
    
            $('#test').append('<span>0</span><br />');
    
            $.addToEndReady(function(){
    
                $('#test').append('<span>end</span><br />');
    
            });
    
        });
    
        // inicio del modulo
        $(function (ev) {
    
            $('#test').append('<span>1</span><br />');
    
        });
    
        $(function (ev) {
    
            $('#test').append('<span>2</span><br />');
    
        });
    
    } (jQuery));