2010-03-23 14 views
17

Ho una pagina con un set di tabulazioni. Ciascuna scheda è caricata dalla funzione jQuery .load().Esegui la funzione dopo che tutte le richieste ajax .load() sono finite

Desidero visualizzare un'animazione di caricamento che scompare quando tutte le richieste di ajax sono terminate. Tuttavia, document.ready() mi ha fornito solo un successo limitato.

Come posso garantire che tutte le richieste ajax siano completate prima di eseguire il codice per nascondere l'animazione di caricamento?

+0

CORRELATI: [In attesa di più chiamate asincrone da completare prima di continuare] (http://stackoverflow.com/question s/2768293/attesa-su-più-asincrone-chiamate-a-completa-prima-continua) –

risposta

5

ajaxComplete

Per la documentazione:

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

Bene, questo verrà attivato al completamento di ogni richiesta AJAX. Ho letto la domanda come "Come rilevare quando sono finiti tutti?" – Matt

3

Utilizzare il callback argomento per .load(), impostazione di un flag o aumentando un contatore nella funzione di callback. Una volta impostati tutti i flag o il contatore raggiunge il numero di schede, si sa che tutte le schede sono state caricate ed è possibile rimuovere l'animazione.

In pseudocodice che potrebbe o non potrebbe essere valido 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

Buon approccio, ma come faccio a sapere quando il numero giusto è stato raggiunto? Scrivere un ciclo 'while' che aspetta il numero giusto da impostare sembra una cattiva idea per qualche motivo ... – Mike

+0

Come ho detto, usa un contatore globale. Aggiornerò la mia risposta – Thomas

+0

Ah! Vedo quello che stai dicendo ... Darò questo a provare a domani e vedere come funziona! Grazie mille! – Mike

-1

un'occhiata a questo post e risposte ... https://stackoverflow.com/a/13090589/999958

Un utile soluzione per me: Guarda una chiamata ajaxCallComplete() in ogni .plete (...);

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

La speranza può aiutare ...

-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

funziona correttamente per me @KittMedia –

+0

Questo è veramente buono. Ho usato $ (document) .ajaxComplete (function() {...}), ma senza il document.ready. Funziona bene per IE8 (invece di usare setTimeout()). – goamn

1

Fondamentalmente, ho quasi simile di questo problema, che voglio caricare una griglia dopo aver completato il carico 2 caselle combinate e alla fine Voglio caricare una griglia, quindi ho risolto il problema

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; 
     }); 
    }); 
Problemi correlati