2010-03-23 35 views
17

Tôi có một trang có bộ tab. Mỗi tab được tải bởi hàm jQuery .load().Chức năng thực thi sau khi tất cả các yêu cầu ajax .load() được hoàn thành

Tôi muốn hiển thị hoạt ảnh tải biến mất khi tất cả các yêu cầu ajax được hoàn tất. Tuy nhiên, document.ready() chỉ cung cấp cho tôi thành công hạn chế.

Làm cách nào để đảm bảo rằng tất cả yêu cầu ajax được hoàn thành trước khi thực thi mã để ẩn hoạt ảnh tải?

+0

LIÊN QUAN: [Chờ nhiều cuộc gọi không đồng bộ để hoàn thành trước khi tiếp tục] (http://stackoverflow.com/question s/2768293/chờ-trên-nhiều-không đồng bộ-cuộc gọi-để-đầy-trước-tiếp tục) –

Trả lời

5

ajaxComplete

mỗi tài liệu:

$('.log').ajaxComplete(function() { 
    $(this).text('Triggered ajaxComplete handler.'); 
}); 
+3

Vâng, điều này sẽ cháy khi hoàn thành mỗi yêu cầu AJAX. Tôi đọc câu hỏi là "Làm thế nào để phát hiện khi chúng được hoàn thành?" – Matt

3

Sử dụng callback lập luận để .load(), thiết lập một lá cờ hoặc tăng bộ đếm trong hàm callback. Khi tất cả cờ được đặt hoặc bộ đếm đạt đến số lượng tab, bạn biết tất cả các tab đã được tải và bạn có thể xóa hoạt ảnh.

Trong giả mà có thể hoặc không có thể có giá trị JavaScript:

loadedTabs = 0; 

function onLoad() { 
    for (int i = 0; i < numTabs; ++i) { 
     tabs[i].load(tabUrl(i), tabLoaded); 
    } 
} 

function tabLoaded() { 
    ++loadedTabs; 
    if (loadedTabs == numTabs) 
     loadingAnimation.display = 'none'; 
} 
+0

Cách tiếp cận tốt, nhưng làm thế nào tôi biết khi nào đúng số điện thoại đã đạt được? Viết một vòng lặp 'while' chờ số đúng được đặt có vẻ như một ý tưởng tồi vì một lý do nào đó ... – Mike

+0

Như tôi đã nói, hãy sử dụng bộ đếm toàn cục. Tôi sẽ cập nhật câu trả lời của mình. – Thomas

+0

Ah! Tôi thấy những gì bạn đang nói ... Tôi sẽ thử cái này vào ngày mai và xem nó hoạt động như thế nào! Cám ơn rất nhiều! – Mike

-1

Nhìn vào bài đăng này và câu trả lời ... https://stackoverflow.com/a/13090589/999958

Một hữu ích workaround cho tôi: Nhìn vào ajaxCallComplete() gọi trong mỗi .complete (...);

$(document).ready(function(){ 
    loadPersons(); 
    loadCountries(); 
    loadCities(); 
}); 

// Define how many Ajax calls must be done 
var ajaxCalls = 3; 
var counter = 0; 
var ajaxCallComplete = function() { 
    counter++; 
    if(counter >= ajaxCalls) { 
      // When all ajax calls has been done 
     // Do something like hide waiting images, or any else function call 
     $('*').css('cursor', 'auto'); 
    } 
}; 

var loadPersons = function() { 
     // Show waiting image, or something else 
    $('*').css('cursor', 'wait'); 

    var url = global.ctx + '/loadPersons'; 
    $.getJSON(url, function(data) { 
      // Fun things 
    }) 
    .complete(function() { ajaxCallComplete(); }); 
}; 

var loadCountries = function() { 
    // Do things 
    var url = global.ctx + '/loadCountries'; 
    $.getJSON(url, function(data) { 
      // Travels 
    }) 
    .complete(function() { ajaxCallComplete(); }); 
}; 

var loadCities = function() { 
    // Do things 
    var url = global.ctx + '/loadCities'; 
    $.getJSON(url, function(data) { 
      // Travels 
    }) 
    .complete(function() { ajaxCallComplete(); }); 
}; 

Hy vọng có thể giúp ...

-1
var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm.add_beginRequest(BeginRequestHandler); 
prm.add_endRequest(EndRequestHandler); 

function BeginRequestHandler(sender, args) { 
    $modal.show(); 
    $overlay.show(); 
} 

function EndRequestHandler(sender, args) { 
    $modal.hide(); 
    $overlay.hide(); 

} 
4
$(document).ready(function() { 
    $(document).ajaxComplete(function() { 
     alert('Completed'); 
    }); 
}); 
+1

điều này làm việc đúng cho tôi @KittMedia –

+0

Điều này thực sự tốt. Tôi đã sử dụng $ (document) .ajaxComplete (function() {...}), nhưng không có document.ready. Hoạt động tốt cho IE8 (trái với việc sử dụng setTimeout()). – goamn

1

Về cơ bản, tôi có gần như tương tự về vấn đề này, mà tôi muốn tải một lưới sau khi hoàn thành tải 2 hộp combo và lúc kết thúc Tôi muốn tải một mạng lưới, vì vậy tôi đã giải quyết như vậy

function LoadGrid1() 
    { 
     //ajax1 load first dropbox 
    } 

    function LoadGrid2() 
    { 
     //ajax2 load Second dropbox 
    } 

    function LoadGrid() 
    { 
     //ajax3 load Grid after complete the two drops loading... 
    } 

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

    var Executed = false; 

    jQuery(function ($) { 
     $(document).ajaxStop(function() { 
      // Executed when all ajax requests are done. 
      if (!Executed) LoadGrid(); 
      Executed = true; 
     }); 
    }); 
Các vấn đề liên quan