我有一个打开,然后一个AJAX调用由jQuery的对话框。 我想使它所以,如果对话框关闭或取消按钮被按下的AJAX调用被取消,其回调函数没有被调用。 我能想到的一些方法,象这样一个变量来做到这一点:
function doStuff(){
var doCallback = true;
$('#dialog').dialog({
title: 'Dialog Title',
modal: true,
buttons: {
Cancel: function() {
doCallback = false;
doSomethingElse();
}
}
});
$.get('url/url/url', function(data){
if(doCallback){
doTheSuccessThing(data);
}
});
}
但是,不知何故,感觉脏我,它实际上并没有从完成停止AJAX调用。 有没有取消正在进行的AJAX调用内置的方式吗?
Answer 1:
当我有可能被触发多次回调,但我想只能用最后一个,我用这个模式:
var resultsXHR, resultsTimer, resultsId=0;
$('input').keyup(function(){
clearTimeout(resultsTimer); // Remove any queued request
if (resultsXHR) resultsXHR.abort(); // Cancel request in progress
resultsTimer = setTimeout(function(){ // Record the queued request
var id = ++resultsId; // Record the calling order
resultsXHR = $.get('/results',function(data){ // Capture request in progress
resultsXHR = null; // This request is done
if (id!=resultsId) return; // A later request is pending
// ... actually do stuff here ...
});
},500); // Wait 500ms after keyup
});
该abort()单独不足以阻止调用成功回调; 你还可以找到你的回调运行,即使你试图取消该请求。 这就是为什么它需要使用resultsId跟踪器,让你的回调停止处理,如果另一个,后来,重叠的回调蓄势待发。
鉴于多么普遍和繁琐的这是,我认为这是一个好主意来包装它在一个可重复使用的方式,不需要你来了,你要处理的每一个局部变量名的独特三重:
(function($){
$.fn.bindDelayedGet = function(event,delay,url,dataCallback,dataType,callback){
var xhr, timer, ct=0;
return this.bind(event,function(){
clearTimeout(timer);
if (xhr) xhr.abort();
timer = setTimeout(function(){
var id = ++ct;
xhr = $.get(url,dataCallback && dataCallback(),function(data){
xhr = null;
if (id==ct) callback(data);
},dataType);
},delay);
});
};
})(jQuery);
// In action
var inp = $('#myinput').bindDelayedGet('keyup',400,'/search',
function(){ return {term:inp.val()}; },
'html',
function(html){ $('#searchResults').clear().append(html); }
);
你可以找到更详细的讨论上面的代码在我的网站 。
Answer 2:
好了,所以基于关闭使用由我想出了这样的$不用彷徨函数返回XmlHttpRequest对象中的建议:
function doStuff(){
var ajaxRequest = $.ajax({
url : 'url/url/url',
type : "GET",
success : function(data){
ajaxRequest = null;
doSuccessStuff(data);
}
});
$('#dialog').dialog({
title: 'Stuff Dialog',
bgiframe: true,
modal: true,
buttons: {
Cancel: function() {
if (ajaxRequest)
ajaxRequest.abort();
doCancelStuff();
}
}
});
}
看来工作和清洁的感觉给我。
Answer 3:
在jQuery的方法,但你可以使用XmlHttpRequest对象从jQuery GET / POST / AJAX函数返回。
从jQuery的博客 :
// Perform a simple Ajax request
var req = $.ajax({
type: "GET",
url: "/user/list/",
success: function(data) {
// Do something with the data...
// Then remove the request.
req = null;
}
});
// Wait for 5 seconds
setTimeout(function(){
// If the request is still running, abort it.
if ( req ) req.abort();
}, 5000);
Answer 4:
看起来是这样,但我从来没有做过。
$.get返回XmlHttpRequest对象,它有一个abort()你可以调用方法。 也许尝试呢?
Answer 5:
如果你把一个条件在脚本AJAX来这里的条件是真的,你输出你的HTML,否则,你不输出任何东西,那么你可以做简单的像这样成功的函数如果(HTML)检查:
$.ajax({
type: "GET",
url: "url.php",
data: "data="+data,
success: function(html)
{
if(html){
$("#container").empty().html(html);
}
}
});
在这个例子中,url.php可能是这个样子:
$data = $_GET['data'];
if($data=="whatever"){
echo "
}else{}
这为我工作。 我知道这个帖子是旧的,但希望它可以帮助别人。
文章来源: Cancel a jQuery AJAX call before it returns?