【问题标题】:prevent jQuery post request executed twice by double click防止双击执行两次jQuery post请求
【发布时间】:2015-04-06 20:20:44
【问题描述】:

我搜索了相同的问题,但没有找到一个适合我的具体案例的问题。

我有一个元素

<span id="myButton">Click</span>

以及绑定到它的 jQuery 后请求

$(document).ready( function()
      {
      $(document).on( 'click', '#myButton', function(e)
        {
        $.post( "RESPONDING_WEBPAGE_HERE.php" ).done( function( result )
            {
            console.log( result );
            });
        });
      });

现在,每次单击按钮时,它都会发出一个后请求。说得通。如果结果函数 (.done()) 被执行,我想要的是一个只执行后请求的好解决方案。

当然,我知道用 var isAjaxRequest = false; 之类的变量来处理它,将其设置为 true,然后在结果函数中返回 false,但也许有更好的(jQuery build -in) 的方式。

这是我现在的解决方案。如果有更好的,我会非常棒。

var isAjaxRequest = false;    
$(document).ready( function()
          {
          $(document).on( 'click', '#myButton', function(e)
            {
            if( !isAjaxRequest )
              {
              isAjaxRequest = true;
              $.post( "RESPONDING_WEBPAGE_HERE.php" ).done( function( result )
                {
                isAjaxRequest = false;
                console.log( result );
                });
              }
            });
          });

谢谢你=)

【问题讨论】:

  • 第一次点击后使用 .attr() 禁用按钮

标签: javascript jquery ajax html post


【解决方案1】:

我通常在单击按钮时将按钮设置为禁用,然后在 POST 请求的回调中删除禁用属性。

$(document).on('click', '#button', function () {
  $('#button').attr('disabled', true);

  $.post('something').done(function () {
    $('#button').removeAttr('disabled');
  }).fail(function () {
    $('#button').removeAttr('disabled');
  });
});

这将防止按钮在被点击后再次被点击。

根据 cmets;如果您希望在 span 元素或其他不允许 disabled 属性的元素上具有此行为,则可以在单击时设置一个类。

$(document).on('click', 'span#button:not(.disabled)', function () {
  $(this).addClass('disabled');

  $.post('something').done(function () {
    $(this).removeClass('disabled');
  }).fail(function () {
    $(this).removeClass('disabled');
  });
});

上面的代码将确保元素只有在没有disabled 类的情况下才能被点击。这也适用于按钮元素,因此无需为这两种方法重复代码。

【讨论】:

  • 谢谢。至少比我的版本好,但也许有更好的解决方案。我只想等几分钟。顺便说一句:我有一些不是按钮的元素(跨度等)。这对它有用吗?
  • Span 元素没有 disabled 属性,因此对它们不起作用。如果 Span 元素充当按钮,那么为什么不使用按钮呢?
  • 这是我一个月前应该考虑的事情。重构我的代码需要很长时间。对不起。顺便说一句:如果您认为图标...对我来说是一个按钮,那将没有意义,尽管它会起作用。
  • 检查跨度和其他不允许禁用属性的元素的更新答案。
【解决方案2】:

我喜欢使用.one() 附加事件处理程序,并在ajax 调用完成后重新附加事件。即使您的目标不支持禁用,这也将处理所有情况:

//define handler function
var myButtonHandler = function(e) {
  $.post("RESPONDING_WEBPAGE_HERE.php").done(function() {
    attachButtonHandler("#mybutton"); //re-attach the click event after AJAX complete
  });
}

//attach an event handler that's only good for one click
function attachButtonHandler(selector) {
  $(document).one('click', selector, myButtonHandler);
}

//on doc ready, attach the event handler for the first time
$(function() {
  attachButtonHandler("#mybutton");
});

【讨论】:

  • 在每次调用之后重新附加处理程序...不是那个时间很昂贵还是 javascript/jQuery 只在核心内存储一个函数指针?
  • jQuery 在这里没有任何魔力,重新附加事件处理程序会产生一些开销,但我已经使用了很多,但从未遇到任何性能问题。这完全取决于音量——您的页面每秒会执行数百次吗?如果不是,我怀疑你会注意到任何性能差异。
猜你喜欢
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
相关资源
最近更新 更多