2012-03-20 77 views
0

我有以下代码:当jquery.loads完成时jquery事件被触发了吗?

$(function() { 
    $("#ARO").load('/DA.aspx?section=ARO #ARO', function() { 
     DoSomething1(); 
    }); 
    $("#ERO").load('/DA.aspx?section=ERO #ERO', function() { 
     DoSomething2(); 
    }); 
    $("#IRO").load('/DA.aspx?section=IRO #IRO', function() { 
     DoSomething3(); 
    }); 
    $("#ORO").load('/DA.aspx?section=ORO #ORO', function() { 
     DoSomething4(); 
    }); 
    CodeIWishToExecuteAfterAllLoads(); 
}); 

正如你所知道的jQuery负载是异步的!所以函数将在所有加载事件完成之前执行“CodeIWishToExecuteAfterAllLoads()”

我需要一个事件或某种方式得到“CodeIWishToExecuteAfterAllLoads()”中的所有负载完成

后有任何人对如何acomplished一个想法执行

谢谢。

+1

看看jQuery延期的对象。 http://api.jquery.com/category/deferred-object/ – Mathletics 2012-03-20 14:05:01

+0

http://tutsplus.com/lesson/deferreds/ – Jack 2012-03-20 14:08:55

回答

3

你可以这样做:

var loaded = 0; 
var expected = 4; 
var record_load = function(){ 
    loaded++; 
    if(loaded == expected) 
     CodeIWishToExecuteAfterAllLoads(); 
} 

$("#ARO").load('/DA.aspx?section=ARO #ARO', function() { 
    DoSomething1(); 
    record_load(); 
}); 
$("#ERO").load('/DA.aspx?section=ERO #ERO', function() { 
    DoSomething2(); 
    record_load(); 
}); 
$("#IRO").load('/DA.aspx?section=IRO #IRO', function() { 
    DoSomething3(); 
    record_load(); 
}); 
$("#ORO").load('/DA.aspx?section=ORO #ORO', function() { 
    DoSomething4(); 
    record_load(); 
}); 
+0

我更喜欢这个解决方案 - 这很好,干净而简单,即使是初学者也会理解它 – scibuff 2012-03-20 14:22:55

+0

在我的情况下,我有“期望”的变量被一个Session变量以编程方式填充。 **期望= <%= Session(“Fuentes”)。Count()%>; **。非常感谢你! – euther 2012-03-20 19:33:39

0
$(function() { 
    $("#ARO").load('/DA.aspx?section=ARO #ARO', function() { 
     DoSomething1(); 
     $("#ERO").load('/DA.aspx?section=ERO #ERO', function() { 
      DoSomething2(); 
      $("#IRO").load('/DA.aspx?section=IRO #IRO', function() { 
       DoSomething3(); 
       $("#ORO").load('/DA.aspx?section=ORO #ORO', function() { 
        DoSomething4(); 
        CodeIWishToExecuteAfterAllLoads(); 
       }); 
      }); 
     }); 
    }); 

}); 

这应该工作全部序。如果没有,你可以使用setTimeout()方法来提供几毫秒的手动延迟并执行你的CodeIWishToExecuteAfterAllLoads();

Hopt这是你正在寻找的。

+0

这不行!如果这些元素没有在您的订单中加载,它将永远不会触发CodeIWishToExecute。 – Alytrem 2012-03-20 14:12:36

+1

这应该强制他们加载的顺序,除非我失去了一些东西 – tmjam 2012-03-20 14:14:42

+0

我还没有看到你加载的东西与AJAX。我是错过了一些东西的人。我虽然他在听负载事件:) – Alytrem 2012-03-20 14:17:52

0

下面是我用jQuery的Deferred做的事情。

我需要为几个不同的图表加载数据,并且一旦加载了所有单个图表数据,我想汇总数据和图表

Utils = { 
    createCharts: function(){ 
    Utils.initializeCharts(); 
    Utils.createUserCharts(); 
    }, 

    initializeCharts: function(){ 
    Utils.deferred = $.Deferred().done(function(){ 
     Utils.createAggregateCharts(); 
    }); 

    Utils.remainingCharts = $(".user").size(); 
    }, 

    decrementRemainingCharts: function(){ 
    --Utils.remainingCharts; 
    if (Utils.remainingCharts == 0){ 
     Utils.deferred.resolve(); 
    } 
    }, 

    createUserCharts: function(){ 
    $(".user").each(function (i, user){ 

     // ... 

     $.get(href, function (response){ 
     Utils.chart(chart_id, response); 
     Utils.decrementRemainingCharts(); 
     }); 
    }); 
    }, 

    chart: function(){ 
    // ... 
    }, 

    createAggregateCharts: function(){ 
    // ... 
    } 
}; 

基本上,你创建的Deferred对象与功能时,它的“决心”来称呼。然后,根据一些外部条件,您决定何时拨打Deferred.resolve。它非常优雅。

相关问题