1

防止双击 jQuery 链接的最佳方法是什么?

我有一个触发 ajax 调用的链接,当该 ajax 调用返回时,它会显示一条消息。

问题是如果我双击,或者在 ajax 调用返回之前单击它两次,当我真的只想要一条消息时,我会在页面上看到两条消息。

我需要disabled一个按钮上的属性。但这不适用于链接。

$('a').on('click', function(e){
    e.preventDefault();

    //do ajax call
});
4

9 回答 9

7

您可以使用data-属性,如下所示:

$('a').on('click', function () {
   var $this = $(this);
   var alreadyClicked = $this.data('clicked');
   if (alreadyClicked) {
      return false;
   }
   $this.data('clicked', true);
   $.ajax({
      //some options
      success: function (data) { //or complete
         //stuff
         $this.data('clicked', false);
      }
   })
});
于 2013-09-29T06:59:51.583 回答
5

我带来了下一个简单的 jquery 插件:

(function($) {
  $.fn.oneclick = function() {
    $(this).one('click', function() {
      $(this).click(function() { return false; });
    });
  };
  // auto discover one-click elements
  $(function() { $('[data-oneclick]').oneclick(); });
}(jQuery || Zepto));

// Then apply to selected elements
$('a.oneclick').oneclick();

或者只是在 html 中添加自定义数据属性:

<a data-oneclick href="/">One click</a>
于 2015-01-19T23:28:41.697 回答
1

你需要async:false

默认情况下,所有请求都是异步发送的(即默认设置为true)。如果您需要同步请求,请将此选项设置为false

$.ajax({
      async: false,
      success: function (data) { 

         //your message here
      }
   })
于 2013-09-29T07:33:47.890 回答
1

你可以为此使用一个虚拟类。

$('a#anchorID').bind('click',function(){
           if($(this).hasClass('alreadyClicked')){
              return false;
           }else{
                $(this).addClass('alreadyClicked);
                $/ajax({
                    success: function(){$('a#anchorID').removeClass('alreadyClicked');},
                    error: function(){$('a#anchorID').removeClass('alreadyClicked');}
                });
           }});
于 2013-09-29T07:07:46.190 回答
0

尽管提供了一些很好的解决方案,但我最终使用的方法是只使用一个<button class="link">我可以设置disabled属性的方法。

有时最简单的解决方案是最好的。

于 2015-01-23T10:14:01.267 回答
0

检查这个例子。您可以在第一次单击后通过 CSS 属性禁用按钮(并在 ajax 请求或使用 setTimeout 后删除此属性)或使用 jQuery.one() 函数在第一次单击后删除触发器(不禁用按钮)

var normal_button = $('#normal'),
  one_button = $('#one'),
  disabled_button = $('#disabled'),
  result = $('#result');

normal_button.on('click', function () {
  result.removeClass('hide').append(normal_button.html()+'<br/>');
});

one_button.one('click', function () {
  result.removeClass('hide').append(one_button.html()+'<br/>');
});

disabled_button.on('click', function () {
  disabled_button.attr('disabled', true);
  setTimeout(function () {
    result.removeClass('hide').append(disabled_button.html()+'<br/>');
  }, 2000);
});
于 2013-09-29T07:38:59.580 回答
-1

您可以使用 Jquery 第二次禁用该链接上的点击事件

$(this).unbind('click');

请参阅此 jsfiddle 以供参考 Demo

于 2013-09-29T07:03:27.107 回答
-1

您可以禁用您的链接(例如,href="#"),并使用click事件来代替,使用 jQueryone()函数绑定到链接。

于 2013-09-29T07:16:10.860 回答
-1

将所有链接与“按钮”类绑定并尝试以下操作:

$("a.button").click(function() { $(this).attr("disabled", "disabled"); });
$(document).click(function(evt) {
     if ($(evt.target).is("a[disabled]"))
          return false;
});
于 2013-09-29T07:18:09.670 回答