【问题标题】:jquery disable submit button on form submissionjquery禁用表单提交上的提交按钮
【发布时间】:2011-07-23 15:48:26
【问题描述】:

无论出于何种原因,尽管这段代码确实刷新了页面,但没有发布任何字段...

$('form').submit(function(){
    $('input[type=submit]', this).attr('disabled', 'disabled');
});

有没有更好的编码方式?

【问题讨论】:

  • 好吧,在函数执行完它的动作之后,表单就被提交了。这不是你想要的吗?
  • 所以您尝试禁用按钮(您是否尝试使用 ajax?)并提交表单字段并询问两者?或者只是禁用。如果页面立即刷新,禁用将不起作用。
  • 一旦他们点击“提交”,提交按钮就会被禁用,表单应该被提交,并且所有的 $_POST 变量都应该被设置。
  • 您的所有表单字段都设置了name 属性吗?

标签: jquery forms submit


【解决方案1】:

您的代码正在更改表单的提交操作。它不是提交,而是更改按钮属性。

试试这个:

$('input[type=submit]').click(function() {
    $(this).attr('disabled', 'disabled');
    $(this).parents('form').submit();
});

【讨论】:

  • 如果表单是通过其他方式提交的(例如在文本框中按回车键),这将不起作用。
  • 这也不起作用。我要做的就是防止人们重复提交表单。 IE。一旦他们点击“提交”,提交按钮就会被禁用,表单应该被提交,并且所有的 $_POST 变量都应该被设置。
  • 这会破坏 HTML5 验证。
【解决方案2】:

没有理由您的代码shouldn't work。提交表单时,提交按钮被禁用。我在演示中检查了正在传输到 JSFiddle 的标头,并且确实正在发送表单字段(在 IE 和 Chrome 中测试):

POST http://fiddle.jshell.net/josh3736/YnnGj/show/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://fiddle.jshell.net/josh3736/YnnGj/show/
Accept-Language: en-US,en;q=0.7,es;q=0.3
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: fiddle.jshell.net
Content-Length: 9
Connection: Keep-Alive
Pragma: no-cache

test=It+works

您的下一步应该是:

  • 使用允许您检查 HTTP 流量的工具(我最喜欢的是 Fiddler)来查看您的表单字段是否真的被发送到服务器。如果是,那显然是您的服务器出了问题。
  • 如果未发送表单字段,则说明您的页面中发生了其他事情。发布更多您的代码,以便我们准确了解发生了什么。

【讨论】:

    【解决方案3】:

    如果您需要添加按钮,总有<input type='button'> 标签可以提供帮助。如果不想提交按钮提交,最好的办法是不添加提交按钮。

    【讨论】:

      【解决方案4】:

      什么对我有用....

      $('body').bind('pagecreate', function() {
          $("#signin-btn").bind('click', function() {
              $(this).button('disable');
              showProgress(); // The jquery spinny graphic
              $('form').submit();
          });
      });
      

      【讨论】:

        【解决方案5】:

        我已经看到了几种方法:

        • 点击时禁用按钮
        • 在提交时禁用按钮
        • 提交时禁用表单

        但似乎没有一个按预期工作,所以我自己制作了方法。

        在表单中添加一个名为submit-once 的类并使用以下 jQuery:

        $('form.submit-once').submit(function(e){
          if( $(this).hasClass('form-submitted') ){
            e.preventDefault();
            return;
          }
          $(this).addClass('form-submitted');
        });
        

        这会在您的表单中添加另一个类:form-submitted。然后,如果您尝试再次提交表单并且它具有此类,jQuery 将阻止表单提交并退出return; 处的函数,因此不会重新提交任何内容。

        我选择使用$('form.submit-once') 而不是$('form'),因为我的一些表单使用了应该可以多次提交的 Ajax。

        您可以在this jsFiddle 上进行测试。我在表单中添加了target="_blank",以便您可以多次测试提交表单。

        旁注:您可能希望通过防止服务器端重复提交来考虑非 JS 用户。例如,有一个存储上次提交日期/时间的会话变量,并在 3 秒内忽略任何进一步的提交。

        【讨论】:

        • 我喜欢这个解决方案!禁用该按钮似乎取消了 HTML5 表单字段验证。但是这个解决方案很乐意让浏览器运行表单字段验证规则。
        • 控制提交的好方法。未发现此方法存在问题。
        【解决方案6】:

        这是适用于所有输入、按钮和链接并显示图像加载图标的通用解决方案:

        $(function(){
            $(document).on('click', 'input[type=submit], button[type=submit], a.submit, button.submit', function() {
        
                // Preserves element width
                var w = $(this).outerWidth();
                $(this).css('width', w+'px');
        
                // Replaces "input" text with "Wait..."
                if ($(this).is('input'))
                    $(this).val('Wait...');
        
                // Replaces "button" and "a" html with a
                // loading image.
                else if ($(this).is('button') || $(this).is('a'))
                    $(this).html('<img style="width: 16px; height: 16px;" src="path/to/loading/image.gif"></img>');            
        
                // Disables the element.
                $(this).attr('disabled', 'disabled');    
        
                // If the element IS NOT a link, submits the
                // enclosing form.
                if (!$(this).is('a'))    
                    if ($(this).parents('form').length)
                        $(this).parents('form')[0].submit();
        
                return true;
            })
        });
        

        对于链接,您需要添加类submit

        【讨论】:

          【解决方案7】:

          我最终使用的是 Chrome 53:

          $('input[type=submit]').addClass('submit-once').click(function(e){
              if($(this).hasClass('form-submitted') ){
                  e.preventDefault();
                  return;
              }
              $(this).addClass('form-submitted');
          });
          

          【讨论】:

            【解决方案8】:

            您的代码很好。我遇到了同样的问题,但对我来说问题出在 php 中,而不是 javascript 中。当您禁用该按钮时,它不再与表单一起发送,并且我的 php 依赖于提交按钮

            if(isset($_POST['submit'])){
               ...
            }
            

            所以页面刷新但 php 不执行。我现在正在使用具有 required 属性的不同字段。

            【讨论】:

              【解决方案9】:

              我不知道为什么有问题的代码不起作用。这是一个类似且简单的代码 sn-p,我建议您不要过于复杂。

              $("form").submit(function () {
                  // prevent duplicate form submissions
                  $(this).find(":submit").attr('disabled', 'disabled');
              });
              

              优点:

              • 它适用于 HTML5 Form Validation
              • 它以通用方式编写,因此可以“按原样”重复使用;
              • 如果通过单击提交按钮提交表单以及通过其他方式提交表单(例如在文本输入中按 Enter),则它可以工作。

              【讨论】:

              • 这是最实用的解决方案。
              • 这是最好最干净的解决方案