2010-03-23 37 views
17

Sekme kümesine sahip bir sayfam var. Sekmelerin her biri jQuery .load() işlevi tarafından yüklenir.Tüm ajax .load() istekleri tamamlandıktan sonra işlevi çalıştır

Tüm ajax istekleri tamamlandığında ortadan kaybolan bir yükleme animasyonu görüntülemek istiyorum. Ancak, document.ready() sadece bana sınırlı bir başarı sağlamıştır.

Yükleme animasyonunu gizlemek için kod çalıştırılmadan önce tüm ajax isteklerinin tamamlanmasını nasıl sağlayabilirim? belgelere Başına

+0

gibi çözülür: http://stackoverflow.com/question ([birden asenkron bekliyorum devam etmeden önce tamamlanması çağrısında] s/2768293/bekleyen-çok-asenkron-aramalar-tamamlamak-devam-devam) –

cevap

5

ajaxComplete

:

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

Peki, bu her AJAX isteğinin tamamlanması üzerine ateş edecektir. Soruyu "Hepsi bittiğinde nasıl tespit edilir?" Diye okudum. – Matt

3

Kullanım .load() için callback argüman, bir bayrak ayarlamak veya geri arama işlevinde bir sayaç artar. Tüm bayraklar ayarlandığında veya sayaç sekmelerin sayısına ulaştığında, tüm sekmelerin yüklendiğini bilirsiniz ve animasyonu kaldırabilirsiniz. Burada

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

İyi bir yaklaşım, ama doğru numaraya ne zaman ulaşıldığını nasıl bilebilirim? Belirlenecek doğru numarayı bekleyen 'while' döngüsünü yazmak, bir sebepten dolayı kötü bir fikir gibi görünüyor ... – Mike

+0

Dediğim gibi, global bir sayaç kullanın. Cevabımı güncelleyeceğim. – Thomas

+0

Ah! Ne dediğini görüyorum ... Bunu yarın deneyeceğim ve nasıl çalıştığını göreceğim! Çok teşekkürler! – Mike

32
.ajaxStop(handler) 

Belgeleme: veya JavaScript geçerli olabilir de olmayabilir de pseudocode

bu yazı ve cevaplara http://api.jquery.com/ajaxStop/

+0

bu doğru cevaptır. – Jason

+0

İyi puanlar, Andy. Sabit. –

-1

Bak ... https://stackoverflow.com/a/13090589/999958

Yararlı bir Benim için geçici çözüm: Her .complete (...) ajaxCallComplete() çağrısına bakın; Umut yardımcı olabilir

$(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(); }); 
}; 

... Temelde

-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

bu benim için düzgün çalışıyor @KittMedia –

+0

Bu gerçekten çok iyi. $ (Document) .ajaxComplete (function() {...}) dosyasını kullandım, ancak document.ready. IE8 için iyi çalışır (setTimeout() kullanarak değil). – goamn

1

, ben yükü 2 açılan kutular tamamladıktan sonra ve sonunda bir kılavuz yüklemek istediğiniz, bu konunun neredeyse benzer var Ben bir ızgara yüklemek istiyorum, bu yüzden iLGİLİ o

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; 
     }); 
    }); 
İlgili konular