中止jQuery JSONP请求将抛出错误
我正在使用jQuery制作简单的自动提示(autocompleter)插件。 不幸的是我必须使用jsonp。 没关系,它可以工作,但是当我中止请求时,它会抛出错误。
Uncaught TypeError: Property 'jQuery171036404498340561986_1330693563756' of object [object Window] is not a function
有代码
if(xhr) {xhr.abort()}; xhr = $.ajax({ url: "someurl/getmedata", type: 'get', dataType: 'jsonp', data: {q: "query"}, success: function(results) {}, error: function() {} })
使用json,xml或其他请求的经典方式可以正常工作。
安妮的建议?
JSONP
不使用XMLHTTPRequest
但实际上在文档中创建了一个标记,以便能够发出跨域请求。
您根本无法中止JSONP请求。
它在$ .ajax()文档中声明:
某些类型的Ajax请求(例如JSONP和跨域GET请求) 不使用XHR ; 在这些情况下,传递给回调的XMLHttpRequest和textStatus参数是未定义的。
至于jQuery 1.5+,以前从$ .ajax()返回XHR对象,现在它返回一个超集jqXHR对象,它封装了XHR对象。
当传输机制不是XMLHttpRequest(例如,JSONP请求的脚本标记)时,jqXHR对象尽可能模拟本机XHRfunction 。
所以它返回一个对象但实际上没有一些function,比如.abort()。
插件jQuery-JSONP似乎提供了手动中止JSONP请求的可能性。 我自己没有用过,但值得一试。
jQuery使用标记来实现JSONP。 您无法中止脚本标记的加载。
首先,使用一些排序逻辑。 这将确保您的最后一个请求胜过旧的请求。 这里有一个例子 。
此外,您可以利用这些$.ajax
设置:
timeout:
为每个请求设置一个时间限制,防止请求以静默方式失败。
beforeSend:
在拨打电话前validation一些条件。 补充测序助手。
As of jQuery 1.5, the beforeSend option will be called regardless of the type of request.
例:
function updateResults() { // Init counter & record current request if (!window.reqSeq) window.reqSeq = 0; window.reqSeq +=1; var thisRequest = window.reqSeq; $.ajax({ url: [..], crossDomain: true, contentType: "application/json", dataType: 'jsonp', timeout: 5000, // give 5 seconds of margin data: { [..] }, beforeSend: function() { if(thisRequest < window.reqSeq) { return false; } }, success: function(data, textStatus, jqXHR) { if(thisRequest < window.reqSeq) { return; } else print(data); }, error: function(jqXHR, textStatus, errorThrown) { // it'll be called on timeout (error) and beforeSend (abort) print(textStatus); } }); }