2012-05-08 14 views
36

ho questo ajax chiamata jQuery:

$.ajax({ 
    url : 'my_action', 
    dataType: 'script', 
    beforeSend : function(){ 
     if(1 == 1) //just an example 
     { 
      return false 
     } 
    }, 
    complete: function(){ 
     console.log('DONE'); 
    } 
}); 

voglio fermare la chiamata AJAX sotto la beforeSend se la condizione ritorna true ma return false non si ferma la chiamata AJAX.

Come è possibile effettuare la chiamata ajax su stop allo beforeSend?

UPDATE ======= =========

return false funziona pure.

+0

Possibile duplicato di http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jquery –

risposta

69
$.ajax({ 
    url : 'my_action', 
    dataType: 'script', 
    beforeSend : function(xhr, opts){ 
     if(1 == 1) //just an example 
     { 
      xhr.abort(); 
     } 
    }, 
    complete: function(){ 
     console.log('DONE'); 
    } 
}); 
+2

E se si utilizza '$ (document) .on (" ajax: beforeSend ", ".my-selector", function (e, xhr) {...}) ', nota che l'argomento' xhr' è il secondo. –

10

maggior parte dei metodi jQuery Ajax restituire un XMLHttpRequest (o equivalente) di opporsi, in modo da poter semplicemente utilizzare abort().

var test = $.ajax({ 
    url : 'my_action', 
    dataType: 'script', 
    beforeSend : function(){ 
     if(1 == 1) //just an example 
     { 
      test.abort(); 
      return false 
     } 
    }, 
    complete: function(){ 
     console.log('DONE'); 
    } 
}); 
+0

Qui c'è un presupposto pericoloso che beforeSend non viene chiamato prima che il metodo ajax ritorni. Stai passando un oggetto con beforeSend nel metodo ajax, quindi il metodo ajax potrebbe chiamarlo molto prima di tornare per impostare il valore del test. Se il metodo ajax chiama beforeSend in modo sincrono (ad esempio prima che restituisca qualcosa), il test non avrà un valore mentre viene eseguito beforeSend. Questo sarebbe un errore. Sarebbe più sicuro chiamare abort sull'oggetto jqXHR passato a beforeSend, come l'altra risposta in questo thread. – Triynko

6
beforeSend:function(jqXHR,setting) 
{ 
    // if(setting.url != "your url") jqXHR.abort(); 
    if(1 == 1) //just an example 
    { 
     jqXHR.abort(); 
    } 
} 
2

xhr.done(); questo funziona per me

$.ajax({ 
    url : 'my_action', 
    dataType: 'script', 
    beforeSend : function(xhr){ 
     if(1 == 1) //just an example 
     { 
      return false 
     }; 
     xhr.done(); //this works for me 
    }, 
    complete: function(){ 
     console.log('DONE'); 
    } 
}); 

http://api.jquery.com/jquery.ajax/

jqXHR.done(function(data, textStatus, jqXHR) {}); 

Un'alternativa costruire all'opzione di callback successo, fare riferimento a deferred.done() per i dettagli di implementazione.