2010-06-28 3 views
3

jQuery의 ajaxSend 및 ajaxStop을 사용하여 ajax 요청이 활성화 될 때마다 회 전자를 표시했습니다. 일부 플러그인이 Ajax 요청을 중단하면 AjaxStop이 트리거되지 않고 페이지가 새로 고쳐질 때까지 트리거되지 않습니다. 중단 된 요청은 여전히 ​​jQuery로 계산됩니다. ajaxStop 트리거를 만들 수 있습니까? 아니면 더 좋은 방법이 있습니까?중단 된 호출이있을 때 트리거 jQuery의 ajaxStop 이벤트

답변

3

글쎄 나는 내가 아주 좋아하는 방식을 알아 냈다. XMLHttpRequest abort 메서드에 패치를 적용하여 jQuery의 ajax 카운터를 줄이고 마지막 요청 인 경우 처리기를 트리거합니다. 아직 브라우저에서 얼마나 잘 작동하는지 확신 할 수 없습니다.

var old_abort = XMLHttpRequest.prototype.abort; 
XMLHttpRequest.prototype.abort = function(){ 
    jQuery.proxy(old_abort, this)(); 
    if (jQuery.active-- === 1) 
     jQuery.event.trigger("ajaxStop"); 
}; 
1

내가 대신 complete 이벤트를 사용합니다 - 무슨 일이 있어도 실행하지 그 :
이 이벤트는 관계없이 요청 이 성공 또는 아니었다면의 전화 입니다

전체 (로컬 이벤트). 동기 요청의 경우에도 은 항상 완전한 콜백을 수신합니다 ( ).

$.ajax({ 
    complete: function(){ 
    // hide your spinner 
    } 
}); 

당신이 있는지 필요가없는 경우,하지만 당신은 ajaxStop 이벤트를 트리거 할 수 있습니다. $(this).trigger('ajaxStop');

+0

아약스 이벤트가 완료 될 때마다 'complete'가 실행됩니다. 즉, 내 회 전자를 숨기려면이를 사용하면 다른 사람이 계속 실행중인 경우에도 하나의 요청이 완료되면 숨길 수 있습니다. – Jake

2

에만 dataType와 = "JSON"에 대한, jQuery를 1.5.1에 ​​http://forum.jquery.com/topic/ajaxstart-not-fired-when-jquery-active-changes-from-0-to-1

업그레이드를 참조하거나 위의 제이크가 게시 패치를 적용 jQuery를 1.4.2에서 문제가 될 것으로 보인다. 또한 패치를 다음과 같이 수정하여 사용 사례에 맞게 올바르게 수정해야합니다.

f_abort = XMLHttpRequest.prototype.abort; 
XMLHttpRequest.prototype.abort = function() { 
    $.proxy(f_abort, this)(); 
    if ($.active === 1) { 
    $.event.trigger("ajaxStop"); 
    $.active = 0; 
    } else if ($.active > 1) { 
    $.active--; 
    } 
};