我正在使用 JSONP ajax 调用从不同的域加载一些内容,如果用户在按钮上引起“鼠标悬停”,所有这些内容都会被执行。
我可以捕获 $.ajax() 调用返回作为 xhr 对象,并在每次用户引起“鼠标悬停”时使用它来中止 ajax 请求。但是 JSONP 回调函数仍然被调用,这会导致错误,我认为这是因为 xhr.abort() 方法不会阻止回调函数被调用。
我尝试使用 try{}catch(e){} 包围 $.ajax() 调用,但在调用 xhr.abort() 方法后,错误仍然存在。
有没有办法处理这个异常?
引发的异常是这样的(根据Firebug): jQuery16102234208755205157_1308941669256 不是一个函数
异常的内部结构是这样的: jQuery16102234208755205157_1308941669256({...我来自不同域的json数据...})
最佳答案
基本答案就是给出的 here :您无法真正abort()
JSONP 调用。所以真正的问题是,如何避免多余的回调调用和您看到的错误?
您不能在回调周围使用 try...catch
因为它是异步的;你必须从 jQuery 的末端捕获它,并且 jQuery 通常不处理回调抛出的异常。 (我在我的书 Async JavaScript 中对此进行了讨论。)您想要做的是为每个 Ajax 调用使用唯一的标识符,并且在调用成功回调时,检查该标识符是否与您调用时的标识符相同的电话。这是一个简单的实现:
var requestCount = 0;
$.ajax(url, {
dataType: 'jsonp',
requestCount: ++requestCount,
success: function(response, code) {
if (requestCount !== this.requestCount) return;
// if we're still here, this is the latest request...
}
});
在这里,我利用了这样一个事实:传递给 $.ajax
的任何内容都会附加到在回调中用作 this
的对象。
当然,如果 jQuery 让 abort()
为我们做这件事,那就太好了。
关于jquery - 使用 jQuery 中止 JSONP ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6472509/