【问题标题】:Disable the submit button after clicking and enable it back again after a few seconds单击后禁用提交按钮并在几秒钟后再次启用它
【发布时间】:2012-06-11 13:31:54
【问题描述】:

我在提交表单时使用 jquery $.post。我想在单击按钮后将其禁用 5 秒钟,以避免多次提交表单。

这是我现在所做的:

$('#btn').click(function(){
    $.post(base_url + 'folder/controller/function',$('#formID').serialize(),function(data){
        $('#message').slideDown().html('<span>'+data+'</span>');
    });
});

我之前用过fadeIn和fadeOut,但是当我快速点击按钮测试它时它仍然不起作用。我应该怎么做才能实现我想要发生的事情?

【问题讨论】:

  • $('input[type="submit"]').attr('disabled','disabled'); $('input[type="submit"]').removeAttr('disabled');使用这个
  • 你有什么样的按钮?是&lt;input&gt;/&lt;button&gt;还是&lt;div&gt;/&lt;span&gt;/&lt;a&gt;
  • 只是一个简单的输入型按钮。

标签: jquery ajax forms


【解决方案1】:

你可以像这样做你想做的事:

var fewSeconds = 5;
$('#btn').click(function(){
    // Ajax request
    var btn = $(this);
    btn.prop('disabled', true);
    setTimeout(function(){
        btn.prop('disabled', false);
    }, fewSeconds*1000);
});

或者您可以使用 jQuery 的 .complete() 方法,该方法在 ajax 收到响应后执行:

$('#btn').click(function(){
    var btn = $(this);
    $.post(/*...*/).complete(function(){
        btn.prop('disabled', false);
    });
    btn.prop('disabled', true);

});

编辑: this is an example 有 3 秒的服务器端响应延迟


编辑

因为即使答案已经 8 年了,但仍然受到关注并且 jQuery 越来越不受欢迎,我认为值得添加示例 without jQuery

const fewSeconds = 3
 
document.querySelector('#btn').addEventListener('click', (e) => {
    e.target.disabled = true
  setTimeout(() => {
   e.target.disabled = false
  }, fewSeconds * 1000)
})
&lt;input type='button' id="btn" value="click me" /&gt;

【讨论】:

  • 我会试试这个。看看它是否有效。非常感谢你的回复。 :)
  • 我仍然可以使用这个脚本快速点击。或者可能是因为我在 localhost 中运行我的脚本,所以 ajax 响应要快得多。
  • 我实际上这样做是为了阻止来自我网站中某些链接的点击事件......问题是每次我在每次点击之间点击大约千分之一秒......它只是没有'不关心这个,它会触发两次(如果你疯狂地点击,或者更多)有什么办法可以防止这种情况发生吗?
  • 底部链接的 JSFiddle 示例不起作用,原因是 - 跨域请求被阻止:同源策略不允许读取位于 jsfiddle.net/echo/jsonp 的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。我相信这是一个新的浏览器政策。
  • @mikato 我已经更新了 jsfiddle,它又可以工作了
【解决方案2】:

只需将其放在提交按钮所在页面的 JS 中

<script type="text/javascript">
  $(document).ready(function(){
    $("input[type='submit']").attr("disabled", false);
    $("form").submit(function(){
      $("input[type='submit']").attr("disabled", true).val("Please wait...");
      return true;
    })
  })
</script>

Code source

【讨论】:

    【解决方案3】:

    看看 .success 函数 here 这就是你需要的。

    所以你要做的是禁用点击按钮

    $('#btn').click(function(){
        $('#btn').attr('disabled', true);
        $.post(base_url + 'folder/controller/function', $('#formID').serialize(), function(data) {
            // code on completion here
            })
            .success(function() { 
               $('#btn').attr('disabled', false);
            })
        });
    });
    

    这种方式比较好,如果你的请求需要超过 5 秒才能返回怎么办?

    【讨论】:

    • 我会试试这个。看看它是否有效。非常感谢你的回复。 :)
    • 我不太确定您是否可以将对象传递给$.post,如果dataType 未按定义会发生什么,用户将不得不重新加载页面?
    • 你确实不能,我需要编辑它。还应该使用 .ajax 而不是 .post/.get - jquerybyexample.blogspot.com/2011/11/…
    【解决方案4】:

    如果表单中有多个提交按钮并且您想要服务器端的按钮名称,则作为@Teneff 答案的扩展。

    <script type="text/javascript">
    var fewSeconds = 5;
    $('button').click(function(){
        var btn = $(this);
        var text = btn.text();
        setTimeout(function(){
            btn.prop('disabled', true);
            btn.text("Wait...");
        }, 10);
        setTimeout(function(){
            btn.prop('disabled', false);
            btn.text( text);
        }, fewSeconds*1000);
    });
    <script>
    

    【讨论】:

      【解决方案5】:

      采用任何形式的按钮并将其值累积到变量中。将值替换为“请稍候...”,并在 5 秒后将之前保存的变量传回并禁用为 false。

          $('input[type=submit], input[type=button]').click(function(){
          var btn = $(this);
          var textd = btn.attr("value");
          btn.prop('disabled', true);
          btn.attr('value', 'Please wait...');
          setTimeout(function(){
          btn.prop('disabled', false);
          btn.attr('value', textd);
          }, fewSeconds*1000);
          });
      

      【讨论】:

        【解决方案6】:
                $('#btn').live('click', function () {
                    $(this).prop('disabled', true).delay(800).prop('disabled', false);
                });
        

        //或者

         $('#btn').live('click', function () {
                    var obj = $(this);
                    obj.prop('disabled', true);
                    $.post(base_url + 'folder/controller/function', $('#formID').serialize(), function (data) {
                        $('#message').slideDown().html('<span>' + data + '</span>');
                        obj.prop('disabled', false);
                    });
                });
        

        【讨论】:

        • .delay() 仅延迟动画队列中的项目
        • 从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用 .on() 附加事件处理程序。 source
        猜你喜欢
        • 1970-01-01
        • 2023-03-04
        • 2016-07-15
        • 2020-11-08
        • 2012-04-18
        • 2013-12-21
        • 1970-01-01
        • 2015-12-29
        • 2021-04-02
        相关资源
        最近更新 更多