我有以下代码给我一个方法POST,状态(已取消)错误消息:
$(document).ready(function() { var xhr = false; get_default(); $('#txt1').keyup( function() { if(xhr && xhr.readyState != 4){ alert("abort"); xhr.abort(); } if ($("#txt1").val().length >= 2) { get_data( $("#txt1").val() ); } else { get_default(); } }); function get_data( phrase ) { xhr = $.ajax({ type: 'POST',url: 'http://intranet/webservices.asmx/GetData',data: '{phrase: "' + phrase + '"}',contentType: 'application/json; charset=utf-8',dataType: 'json',success: function( results ) { $("#div1").empty(); if( results.d[0] ) { $.each( results.d,function( index,result ) { $("#div1").append( result.Col1 + ' ' + result.Col2 + '<br />' ); }); } else { alert( "no data available message goes here" ); } },error: function(xhr,status,error) { var err = eval("(" + xhr.responseText + ")"); alert(err.Message) ; } }); } function get_default() { $('#div1').empty().append("default content goes here."); } });
只要每个ajax请求完成,代码实际上都可以工作,但是如果我在txt1中输入快捷键,即在上一个请求完成之前键入下一个字符,我会收到错误消息Method POST,Status(cancelled).
任何人都知道为什么会发生这种情况,以及如何纠正错误?
解决方法
我想这个问题很简单.如果你调用xhr.abort();那么将为挂起的请求调用$.ajax的错误回调函数.所以你应该忽略错误回调的这种情况.所以可以修改错误处理程序
error: function(jqXHR,textStatus,errorThrown) { var err; if (textStatus !== "abort" && errorThrown !== "abort") { try { err = $.parseJSON(jqXHR.responseText); alert(err.Message); } catch(e) { alert("ERROR:\n" + jqXHR.responseText); } } // aborted requests should be just ignored and no error message be displayed }
附:也许另一个我的old answer关闭问题也可能对你有兴趣.