代码之家  ›  专栏  ›  技术社区  ›  Ron Harlev

如何控制jquery$(document.ready)中调用函数的顺序。

  •  12
  • Ron Harlev  · 技术社区  · 14 年前

    我需要能够控制在 $(document).ready 事件。
    这些是多个控件,从多个文件加载,所有这些控件都要求在 ready 事件。它们都启动了对服务器(Ajax)的异步调用。只有做完了,我才需要做些额外的工作。

    这个优雅的解决方案是什么?

    4 回复  |  直到 14 年前
        1
  •  7
  •   Alex Sexton    14 年前

    异步请求 按顺序,但将按他们先完成的顺序返回。因此,没有一种可靠的方法可以强制它们同时结束,但是,您可以构建规则,以便仅在某些组返回后运行代码。

    例如,用一组规则定义一个回调函数,并将其传递给每个 success 所有Ajax请求的回调。

    var completedObject = {};
    
    function groupSuccessCallback() {
      // Test for any combination of requirements
      if ( completedObject.ajax1 && completedObject.ajax2 ) {
        ... // Do something that only requires 1 and 2
      }
      if ( completedObject.ajax1 && completedObject.ajax2 && completedObject.ajax3) { 
        ... // Do something that requires all 3 being done
            // your data is available at completedObject.ajax#
      }
    
      // Or test for _all_ entries for a dynamic count
      var allComplete = true;
      for(var i in completedObject) {
         if ( completedObject.hasOwnProperty(i) && !completedObject[i] ) {
           allComplete = false;
         }
      }
    
      // Do whatchya need.
      if (allComplete) { 
        alert("bb-b-bb-b-b-b-bbb... that's all folks!");
      }
    }
    

    然后在成功函数内设置标志:

    // Ajax1
    completedObject['anything'] = false; // instantiate a dynamic entry in the object or use an array if you can't use names.
    $.ajax({
      ...,
      ...,
      success: function(data) {
        completedObject['anything'] = data || true;
        groupSuccessCallback();
      }
    });
    
        2
  •  2
  •   Juraj Blahunka    14 年前

    作者 关于$(document)中的函数评估顺序。就绪:

    每次新函数 添加到队列中,只是将其添加到数组中,然后 执行时再次弹出。如果没有,请告诉我 发生在你身上。

    $.readylist-仅在1.4之前版本中

    jquery公开了一个名为 $.readyList 但是,它是一个数组,允许函数命令操作 $.readyList in no longer publicly exposed in jQuery 1.4.0

    杂乱的方式

    你可以试试 $(window).load(function () {}); ,它应该在整个窗口加载后执行(而不是在文档准备就绪时执行,因为它与 $(document).ready()

        3
  •  1
  •   Dave Ward    14 年前

    根据页面的其余部分,在 $.ajaxStop 处理程序可能是一个更优雅的选项。

    但是,如果用户能够和/或可能触发随后的$.Ajax()调用,则不合适。 虽然 这些初始呼叫正在进行中。在这种情况下,他们手动触发的调用可能会将$.Ajaxstop事件延长到预期的更长时间。

        4
  •  0
  •   ctrlShiftBryan    14 年前

    创建值为0的变量。在每个Ajax调用的success函数上,将该值增加1,并检查该值是否等于执行completeion函数时的调用总数。