当ajax正在进行时解除绑定事件处理程序

时间:2013-10-01 13:23:49

标签: javascript jquery

我有一个带有按键事件处理程序jsfiddle的文本字段。当我在此字段中键入内容并按“Enter”2次时,将发送2个请求。我想关闭所有事件,而ajax请求正在进行中。一种选择是在ajax调用之前调用.off()函数,然后再次绑定事件处理程序。还有其他选择吗?

3 个答案:

答案 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'
        });