2012-05-08 3 views
36

У меня есть этот JQuery Ajax вызов:

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

Я хочу, чтобы остановить вызов Ajax под beforeSend, если условие возвращает true, но возвращать ложь не остановить вызов Ajax.

Как можно позвонить stop ajax на beforeSend?

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

return false работает хорошо.

+0

Возможный дубликат http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jquery –

ответ

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

И если вы используете '$ (document) .on (" ajax: beforeSend ", «.my-selector», function (e, xhr) {...}) ', обратите внимание, что аргумент' xhr' является вторым. –

10

Большинство методов JQuery Ajax возвращает XMLHttpRequest (или эквивалент) объекта, так что вы можете просто использовать прерывание().

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

Существует опасное предположение, что beforeSend не вызывается перед возвратом метода ajax. Вы передаете объект с помощью метода beforeSend в метод ajax, поэтому метод ajax мог бы вызвать его задолго до возвращения, чтобы установить значение теста. Если метод ajax вызывает синхронно вызов sendSend (т. Е. До того, как он вернет что-либо), тогда тест не будет иметь значения, пока выполняется sendSend. Это было бы ошибкой. Было бы безопаснее вызвать прерывание на объекте jqXHR, переданном beforeSend, как и другой ответ в этом потоке. – Triynko

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

xhr.done(); это работает для меня

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

Альтернативой конструкции к выбору успеха обратного вызова, обратитесь к deferred.done() для деталей реализации.

Смежные вопросы