我有一个带有按键事件处理程序jsfiddle的文本字段。当我在此字段中键入内容并按“Enter”2次时,将发送2个请求。我想关闭所有事件,而ajax请求正在进行中。一种选择是在ajax调用之前调用.off()
函数,然后再次绑定事件处理程序。还有其他选择吗?
答案 0 :(得分:2)
使用来自ajax调用的回调处理程序和用作标志的布尔值。通过在“always”回调中将ajaxLoading boolean设置为false,可以确保可以使其他未来请求独立于当前ajax调用是否抛出错误。
var ajaxLoading = false;
if(!ajaxloading){
ajaxloading=true;
$.ajax({
url: 'your url',
type: 'GET',
dataType: 'JSON'
})
.done(function(data) {
console.log("success");
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
ajaxloading=false;
});
}
答案 1 :(得分:1)
我使用2个布尔标志,如:
var is_requesting = false, should_request = false;
function onkeydown() {
if (is_requesting) {
should_request = true;
return;
}
is_requesting = true;
$.ajax({}, function () {
is_requesting = false;
if (should_request) {
onkeydown();
}
});
}
答案 2 :(得分:1)
你有充分的理由不使用jQuery .off()函数吗?
如果是这样,那么您可以在发出ajax请求之前简单地禁用控件,并在请求完成后重新启用它。这也会阻止用户认为他/她可以通过在请求期间更改文本值来更改结果。
//Disable the input
$('#myresult').prop('disabled', true);
$('#myresult').append('<br>'+$(this).val());
$.ajax({
type: "POST",
beforeSend: function() {},
complete: function() {
//Re-Enable the input
$('#myresult').prop('disabled', false);
},
url: "/echo/json/",
data: { delay : 3 },
success: function(){},
error: function() {},
dataType: 'json'
});