2009-07-28 17 views
42

devo alcune chiamate Ajax sul documento di un sito che visualizzare o nascondere una barra di avanzamento a seconda dello stato ajaxCome chiamare .ajaxStart() su specifiche chiamate AJAX

$(document).ajaxStart(function(){ 
     $('#ajaxProgress').show(); 
    }); 
    $(document).ajaxStop(function(){ 
     $('#ajaxProgress').hide(); 
    }); 

vorrei sostanzialmente overwirte questi metodi su altre parti del sito dove sono fatte molte chiamate rapide ajax e non hanno bisogno che la barra di avanzamento entri e scorra. Sto cercando di collegarli o inserirli in altre chiamate $ .getJSON e $ .ajax. Ho provato a incatenarli ma a quanto pare non va bene.

$.getJSON().ajaxStart(function(){ 'kill preloader'}); 

risposta

35

È possibile associare l'ajaxStart e ajaxStop utilizzando namespace personalizzati:

$(document).bind("ajaxStart.mine", function() { 
    $('#ajaxProgress').show(); 
}); 

$(document).bind("ajaxStop.mine", function() { 
    $('#ajaxProgress').hide(); 
}); 

Poi, in altre parti del sito ti verrà temporaneamente non vincolante prima tua .json chiama:

$(document).unbind(".mine"); 

avuto l'idea da here durante la ricerca di una risposta.

EDIT: Non ho avuto il tempo di testarlo, purtroppo.

+0

Se uso $ (documento) .unbind (". Mio"); prima della chiamata JSON, come posso reindirizzare correttamente lo spazio dei nomi in seguito? – SchweizerSchoggi

+0

questo non funziona più con jquery1.8 – CyberNinja

+0

Non funziona, non viene attivato nulla. – nights

3

Sfortunatamente, l'evento ajaxStart non ha alcuna informazione aggiuntiva che è possibile utilizzare per decidere se mostrare l'animazione o meno.

Comunque, ecco un'idea. Nel tuo metodo ajaxStart, perché non avviare l'animazione dopo 200 millisecondi? Se le richieste di ajax vengono completate in 200 millisecondi, non viene mostrata alcuna animazione, altrimenti viene visualizzata l'animazione. Codice può essere simile:

var animationController = function animationController() 
{ 
    var timeout = null; 
    var delayBy = 200; //Number of milliseconds to wait before ajax animation starts. 

    var pub = {}; 

    var actualAnimationStart = function actualAnimationStart() 
    { 
     $('#ajaxProgress').show(); 
    }; 

    var actualAnimationStop = function actualAnimationStop() 
    { 
     $('#ajaxProgress').hide(); 
    }; 

    pub.startAnimation = function animationController$startAnimation() 
    { 
     timeout = setTimeout(actualAnimationStart, delayBy); 
    }; 

    pub.stopAnimation = function animationController$stopAnimation() 
    { 
     //If ajax call finishes before the timeout occurs, we wouldn't have 
     //shown any animation. 
     clearTimeout(timeout); 
     actualAnimationStop(); 
    } 

    return pub; 
}(); 


$(document).ready(
    function() 
    { 
     $(document).ajaxStart(animationController.startAnimation); 
     $(document).ajaxStop(animationController.stopAnimation); 
    } 
); 
13

se metti questo nella vostra funzione che gestisce l'azione ajax Sarà solo BIND se del caso:

$('#yourDiv') 
    .ajaxStart(function(){ 
     $("ResultsDiv").hide(); 
     $(this).show(); 
    }) 
    .ajaxStop(function(){ 
     $(this).hide(); 
     $(this).unbind("ajaxStart"); 
    }); 
+0

Grazie! Trovo che la tua risposta sia la più facile da implementare. –

+2

Funziona? Puoi usare ajaxStart sul tuo selettore? Dalla documentazione: 'A partire da jQuery 1.8, il metodo .ajaxStart() deve essere collegato solo al documento. –

+0

Penso che non funzionerà ** dopo jQuery 1.8 **. –

4

Inoltre, se si desidera disabilitare chiamate a .ajaxStart() e .ajaxStop(), è possibile impostare global opzione per false nelle vostre .ajax() richieste;)

Vedere più qui: How to call .ajaxStart() on specific ajax calls

+0

questa dovrebbe essere la risposta corretta. ti consente di interrompere la barra di avanzamento dalla visualizzazione per richieste specifiche senza dover modificare tutto il codice. – mamashare

0
<div class="Local">Trigger</div> 

<div class="result"></div> 
<div class="log"></div> 

$(document).ajaxStart(function() { 
$("log")text("Trigger Fire successfully."); 
}); 

$(".local").click(function() { 
$(".result").load("c:/refresh.html."); 
}); 

Basta passare attraverso questo esempio si ottiene una certa idea.When l'utente fa clic l'elemento con classe locale e la richiesta Ajax viene inviata, viene visualizzato il messaggio di log.

0

Ho una soluzione. Ho impostato una variabile js globale chiamata showloader (impostata come falsa per impostazione predefinita). In una qualsiasi delle funzioni che si desidera mostrare al loader è sufficiente impostarlo su true prima di effettuare la chiamata ajax.

function doAjaxThing() 
{ 
    showloader=true; 
    $.ajax({yaddayadda}); 
} 

Quindi ho il seguente nella mia sezione di testa;

$(document).ajaxStart(function() 
{ 
    if (showloader) 
    { 
     $('.loadingholder').fadeIn(200); 
    } 
});  

$(document).ajaxComplete(function() 
{ 
    $('.loadingholder').fadeOut(200); 
    showloader=false; 
}); 
3

uso locale con ambito Ajax Eventi

   success: function (jQxhr, errorCode, errorThrown) { 
        alert("Error : " + errorThrown); 
       }, 
       beforeSend: function() { 
        $("#loading-image").show(); 
       }, 
       complete: function() { 
        $("#loading-image").hide(); 
       } 
4

C'è un attributo nell'oggetto opzioni .ajax() prende chiamato globale.

Se impostato su false, non attiverà l'evento ajaxStart per la chiamata.

$.ajax({ 
     url: "google.com", 
     type: "GET", 
     dataType: "json", 
     cache: false, 
     global: false, 
     success: function (data) { 
Problemi correlati