防止ajax调用两次触发

use*_*079 12 javascript ajax jquery

我有一个ajax电话

$('#button1').on('click', function(e){
    $.ajax({
      url:  url,
      type: 'POST',
      async: true,
      dataType: 'json',
      enctype: 'multipart/form-data',
      cache: false,
      success: function(data){

      },
      error: function(){}
    });
    e.stopImmediatePropagation();
    return false;
});
Run Code Online (Sandbox Code Playgroud)

现在,在10分钟后收到回复.所以ajax调用被多次调用.为什么会发生这种情况/我们如何才能确保只调用一次ajax调用?

dav*_*ave 31

禁用按钮的替代方法是使用.one()方法并在回调后重新绑定事件处理程序:

var clickHandler = function(e){
    $.ajax({
      url:  url,
      type: 'POST',
      async: true,
      dataType: 'json',
      enctype: 'multipart/form-data',
      cache: false,
      success: function(data){
        $('#button1').one('click', clickHandler);
      },
      error: function(){}
    });
    e.stopImmediatePropagation();
    return false;
}

$('#button1').one('click', clickHandler);
Run Code Online (Sandbox Code Playgroud)

  • 添加 `e.stopImmediatePropagation(); 返回 false;` 最后对我有帮助。 (3认同)
  • +1我喜欢这个选项,感觉很优雅 (2认同)

Geo*_*ohn 8

我面临着同样的问题,当我设置时它可以工作async: false。示例代码将如下所示

$('#button1').on('click', function(e){
    $.ajax({
      url:  url,
      type: 'POST',
      async: false,
      dataType: 'json',
      enctype: 'multipart/form-data',
      cache: false,
      success: function(data){

      },
      error: function(){}
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 你不应该这样做,除非你希望你的 UI 挂起一段时间 (2认同)

Pan*_*nde 7

只需.off()在您致电之前立即致电.on()

这将删除所有事件处理程序:

$(element).off().on('click', function() {
    // function body
});
Run Code Online (Sandbox Code Playgroud)

仅删除已注册的“点击”事件处理程序:

$(element).off('click').on('click', function() {
    // function body
});
Run Code Online (Sandbox Code Playgroud)


use*_*079 6

根据布伦南的回答,

$('#button1').on('click', function(e){
    $('#button1').attr('disabled', 'disabled');
    $.ajax({
      url:  url,
      type: 'POST',
      async: true,
      dataType: 'json',
      enctype: 'multipart/form-data',
      cache: false,
      success: function(data){
         $('#button1').removeAttr('disabled');
      },
      error: function(){}
    });
    e.stopImmediatePropagation();
    return false;
});
Run Code Online (Sandbox Code Playgroud)

此处按钮将被禁用,并将在success