2014-08-27 12 views
6

Sto tentando di visualizzare uno spinner di caricamento durante le chiamate Ajax sulla mia pagina. Voglio scegliere come target diverse chiamate Ajax e mostrare diversi spinners. Allo stato attuale, come ajaxStart è un evento globale, tutte le chiamate ajax finiscono per mostrare tutti gli spinners allo stesso tempo.Targeting di chiamate Ajax specifiche che incorporano AjaxStart/Stop

Questo funziona ... aggiunge la classe "carica" ​​a un div nascosto contenente lo spinner e lo visualizza.

$(document).bind("ajaxStart", function() { 
    $body.addClass("loading"); 
}); 

$(document).bind("ajaxStop", function() { 
    $body.removeClass("loading"); 
}); 

Ora da altre risposte pila ho visto che è possibile aggiungere spazi dei nomi a ajaxstart/stop (jQuery should I use multiple ajaxStart/ajaxStop handling)

...... lungo le linee di

$(document).bind("ajaxStart.secondCall", function() { 
    $body.addClass("loading2"); 
}); 

$(document).bind("ajaxStop.secondCall", function() { 
    $body.removeClass("loading2"); 
}); 

Ma questo non funziona nella sua forma attuale. Tutto il consiglio sarebbe apprezzato ...

UPDATE:

come aggiunta al ILYAS SOLUZIONE e sulla base la sua guida ho implementato l'AJAX AVVIO funcitonality NEL MIO chiamata AJAX ....

function sendResponse(thread_id){ 
     $(document).off(".reference_call"); 
     $(document).on("ajaxStart.secondCall", function() { 
     $('.spinner').show(); 
     }); 
$.ajax({ 
    url: 'someURL.php', 
    type: 'post', 
    data: { 
       //data 
     }, 
      success: function(data) { 
      $(document).on("ajaxStop.secondCall", function() { 
       $('.spinner').hide(); 
      }); 
        //do stuff.... 

        } else { 

        //do stuff.... 
        } 
       } 
     }); 
    return false; 
} 
+1

Sei sicuro che i tuoi callback non si attivino? Qui è semplice [jsfiddle] (http://jsfiddle.net/9yywwsjt/1/) funziona come previsto. –

+0

Iilya, grazie per il tuo commento. Il problema è che voglio che la prima serie di funzioni associ la classe di caricamento al corpo e che la seconda funzione si verifichi per una chiamata ajax separata in un momento separato. Al momento entrambi sono chiamati per qualsiasi chiamata ajax su quella pagina - Capisco perché questo sta accadendo, ma non so come indirizzare diverse chiamate Ajax sulla stessa pagina separatamente – GhostRider

+0

Oh, capisco cosa intendi ora. Quindi, ho 2 domande: puoi spostare la logica su quale spinner visualizzare all'interno dei tuoi callback ajaxStart e ajaxStop? In caso contrario, hai provato a eseguire il binding a eventi ajax prima di inviare la richiesta e quindi di disconnetterti una volta completata la richiesta? –

risposta

10

Quindi, come è stato menzionato nella discussione collegata alla domanda, puoi associare e separare da eventi di tipo jax usando i tuoi spazi dei nomi personalizzati. Ecco semplice example dimostrando questo approccio. Nella prima parte del codice si associa a eventi ajax con .firstCall namespace, in questo modo:

$(document).on("ajaxStart.firstCall", function() { 
    $('.spinner1').show(); 
}); 
$(document).on("ajaxStop.firstCall", function() { 
    $('.spinner1').hide(); 
}); 
// then goes your ajax call 

Più avanti nel codice, quando è necessario inviare seconda ajax con diversi ogiva, è necessario associare dal .firstCall namespace e legarsi a .secondCall come questo:

$(document).off(".firstCall"); 
$(document).on("ajaxStart.secondCall", function() { 
    $('.spinner2').show(); 
}); 
$(document).on("ajaxStop.secondCall", function() { 
    $('.spinner2').hide(); 
}); 
// then goes your second ajax call 

in alternativa si potrebbe considerare l'utilizzo di un set di globale Ajax eventi gestori, e spostare la logica su cosa filatore per mostrare/nascondere all'interno di quelle callback, ma questo in realtà dipende da ciò che la logica che è .

+0

Ilya, questo è perfetto. Anche se penso che la tua soluzione nel jfiddle sia marginalmente migliore - almeno per un principiante di jQuery come hai mostrato utilmente queste funzioni allegate ai pulsanti. Ben fatto – GhostRider

+0

@GhostRider Sei il benvenuto! Felice di aiutare! –

0

ho trovato questa implementazione più affidabile (soprattutto quando si utilizzano le promesse e più chiamate asincrone):

$(document).ajaxStart(function(r) { 
 
    if ($('#d-loading').is(':hidden')) { 
 
    $('#d-loading').modal('show'); 
 
    } 
 

 
}).ajaxStop(function(r) { 
 
    if ($('#d-loading').is(':visible')) { 
 
    $('#d-loading').modal('hide'); 
 
    } 
 

 
}).ajaxError(function(event, request, settings) { 
 
    //Deal with error here 
 
});

sto usando un Bootstrap modale, che posso attivare o disattivare. Spero che sia d'aiuto!

0

ho avuto lo stesso problema e risolvere con $.active e beforeSend : function(){},

Problema: Ho qualche codice nella intervallo impostato per l'aggiornamento di notifica e abbiamo applicato sovrapposizione loding a livello globale in modo che tutti AJAX caricare quella sovrapposizione e ogni intervallo set che mostra intervallo .SO Come rimuovere quell'overlay per un particolare ajax?

  1. setInterval(function() { RefreshNotification(); }, 10000);
    $(document).ajaxStart(function() {   
         $('#dvLoading').show(); 
        }); 
        $(document).ajaxStop(function() { 
         $('#dvLoading').hide(); 
        }); 

Soluzione: Come rimuovere oltre giaceva ** Soluzione 1: **
semplice nascondere sovrapposizione sulla beforesend

$.ajax({ 
     type: 'GET', 
     datatype: 'HTML', 
     url: NotificationURL, 
     beforeSend: function() { 

       $('#dvLoading').hide(); 

     }, 
     success: function (result) { } 

}); 

Problema: Se la richiesta del parallelo quindi sopra il codice non funziona

Soluzione 2: nascondere semplice sovrapposizione sulla beforesend e verificare condizioni per la richiesta totale Ajax

$.ajax({ 
     type: 'GET', 
     datatype: 'HTML', 
     url: NotificationURL, 
     beforeSend: function() { 
      //console.log($.active); 
      if ($.active < 2) { 
       $('#dvLoading').hide(); 
      } 
     }, 
     success: function (result) { 
      $("#header_notification_bar").html(""); 
      $("#header_notification_bar").html(result); 
     }, 
     error: function 
      (XMLHttpRequest, textStatus, errorThrown) { 
      alert(errorThrown); 
     } 
    }); 

Godetevi sopra il codice dovrebbe funzionare perfettamente

Problemi correlati