禁用表单提交时的提交按钮

Disable submit button on form submit

提问人:markzzz 提问时间:4/17/2011 最后编辑:markzzz 更新时间:8/1/2022 访问量:231568

问:

我写了这段代码来禁用点击后我网站上的提交按钮:

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

不幸的是,它不会发送表单。我该如何解决这个问题?

编辑我想绑定提交,而不是表单:)

JavaScript jQuery

评论

0赞 naXa stands with Ukraine 2/8/2023
这回答了你的问题吗?jQuery 在表单提交时禁用提交按钮

答:

176赞 Jared Farrish 4/17/2011 #1

做吧:onSubmit()

$('form#id').submit(function(){
    $(this).find(':input[type=submit]').prop('disabled', true);
});

发生的情况是,在按钮实际触发提交事件之前,您完全禁用了该按钮。

您可能还应该考虑使用 ID 或 CLASSes 命名元素,这样您就不会在页面上选择所有提交类型的输入。

演示:http://jsfiddle.net/userdude/2hgnZ/

(请注意,我使用 and,因此表单在示例中并没有实际提交;在您的使用中将其关闭。preventDefault()return false

评论

0赞 markzzz 4/17/2011
是的,事实上我真的很想在页面中绑定所有提交。所以我不介意以这种方式使用 ID 或 CLASS:)尝试过:表单已发送,但按钮将不再禁用...$('input[type=submit]').submit(function()
5赞 Jared Farrish 4/17/2011
您需要将 放在表单上,而不是输入。观看演示。submit()
0赞 markzzz 4/18/2011
是的,它有效!唯一的问题是我在表单上有一个 onSubmit 函数,所以它被 jquery shadow 绑定了!我需要在我的原始函数上实现它,或者更改整个调用!谢谢
0赞 markzzz 4/18/2011
我发现奇怪的是,我无法在提交时绑定点击事件,并且在表单上绑定另一个点击事件后提交:)
2赞 Craig Jacobs 1/13/2014
就我而言,我需要将其包装在$(document).ready中才能使其工作。可能很明显。不明显并且需要一些工作才能弄清楚的是,如果接收 POST(或 GET)的程序正在寻找提交按钮的值,如果它被禁用,那么它将不会包含在 POST 值中。至少我的测试显示了这一点。
0赞 Ankit Tyagi 9/27/2012 #2

如何禁用提交按钮

只需在 onclick 事件上调用一个函数,然后...返回 true 表示提交,返回 false 表示禁用提交。或者在window.onload上调用一个函数,如:

window.onload = init();

并在 init() 中执行如下操作:

var theForm = document.getElementById(‘theForm’);
theForm.onsubmit =  // what ever you want to do 
5赞 Shreekar Patel 2/14/2013 #3

这应该在您的应用程序中处理它。

$(":submit").closest("form").submit(function(){
    $(':submit').attr('disabled', 'disabled');
});

评论

4赞 Patrik Affentranger 9/12/2016
应该改用。.prop("disabled", true)
16赞 Valamas 5/6/2014 #4

禁用的控件不会提交其值,这无助于了解用户是单击了保存还是删除。

因此,我将按钮值存储在隐藏的按钮值中,该按钮值确实被提交。隐藏的名称与按钮名称相同。我用 的名字来称呼我所有的按钮。button

例如<button type="submit" name="button" value="save">Save</button>

基于此,我在这里找到了。只需将单击的按钮存储在变量中即可。

$(document).ready(function(){
    var submitButton$;

    $(document).on('click', ":submit", function (e)
    {
        // you may choose to remove disabled from all buttons first here.
        submitButton$ = $(this);
    });

    $(document).on('submit', "form", function(e)
    {
        var form$ = $(this);
        var hiddenButton$ = $('#button', form$);
        if (IsNull(hiddenButton$))
        {
            // add the hidden to the form as needed
            hiddenButton$ = $('<input>')
                .attr({ type: 'hidden', id: 'button', name: 'button' })
                .appendTo(form$);
        }
        hiddenButton$.attr('value', submitButton$.attr('value'));
        submitButton$.attr("disabled", "disabled");
    }
});

这是我的功能。使用或替换您自己的版本来代替 IsNull 或 undefined 等。IsNull

function IsNull(obj)
{
    var is;
    if (obj instanceof jQuery)
        is = obj.length <= 0;
    else
        is = obj === null || typeof obj === 'undefined' || obj == "";

    return is;
}
41赞 Baig 10/20/2014 #5

具体来说,如果有人在 Chrome 中遇到问题:

要解决此问题,您需要做的是使用元素中的标签来设置 提交按钮 。这将允许 Chrome 在按下按钮后立即禁用该按钮,并且表单提交仍将继续进行......onSubmit<form>disabled

<form name ="myform" method="POST" action="dosomething.php" onSubmit="document.getElementById('submit').disabled=true;"> 
     <input type="submit" name="submit" value="Submit" id="submit"> 
</form>

评论

1赞 Kamafeather 1/23/2015
这不是开发人员的主要部分想要的。Javascript 内容不应内联在 HTML 代码中。可能使用(或)会更好。即使在这种情况下,您也可能在回调内部重新触发表单时遇到问题,陷入无限循环(至少在我使用的最新版本的 Opera 上,它应该使用与 Chrome 相同的引擎)。.on('submit', function() {..}).submit(function() {..}).submit()
14赞 Seppo Erviälä 10/15/2015
这正是我想要的。一个简单的内联,不需要外部库,即使禁用了 JavaScript,也不会进入。
1赞 Shawn de Wet 5/22/2020
在具有 JQuery 验证的表单上对此进行了测试,该验证在验证失败时会阻止提交,最终此答案仍禁用了提交按钮。
7赞 Zia 7/17/2016 #6

简单有效的解决方案是

<form ... onsubmit="myButton.disabled = true; return true;">
    ...
    <input type="submit" name="myButton" value="Submit">
</form>

来源: 这里

2赞 Pablo Pazos 8/5/2017 #7

您的代码实际上适用于 FF,不适用于 Chrome。

这适用于 FF 和 Chrome。

$(document).ready(function() {
        // Solution for disabling the submit temporarily for all the submit buttons.
        // Avoids double form submit.
        // Doing it directly on the submit click made the form not to submit in Chrome.
        // This works in FF and Chrome.
        $('form').on('submit', function(e){
          //console.log('submit2', e, $(this).find('[clicked=true]'));
          var submit = $(this).find('[clicked=true]')[0];
          if (!submit.hasAttribute('disabled'))
          {
            submit.setAttribute('disabled', true);
            setTimeout(function(){
              submit.removeAttribute('disabled');
            }, 1000);
          }
          submit.removeAttribute('clicked');
          e.preventDefault();
        });
        $('[type=submit]').on('click touchstart', function(){
          this.setAttribute('clicked', true);
        });
      });
    </script>
3赞 suresh 12/12/2017 #8

一种更简单的方法。 我试过这个,它对我来说效果很好:

$(':input[type=submit]').prop('disabled', true);

评论

3赞 phil294 8/16/2019
这有什么作用?这如何帮助解决上述禁用按钮不会发送表单的问题?
0赞 Daniel Wu 11/2/2020
这将阻止提交表单。询问者希望表单即使在按钮被禁用时也能继续提交。
0赞 John Langford 4/4/2018 #9

以下内容对我有用:

var form_enabled = true;
$().ready(function(){
       // allow the user to submit the form only once each time the page loads
       $('#form_id').on('submit', function(){
               if (form_enabled) {
                       form_enabled = false;
                       return true;
               }

               return false;
        });
});

如果用户尝试多次提交表单(通过单击提交按钮、按 Enter 等),这将取消提交事件

0赞 Michael Chourdakis 4/7/2018 #10

我一直在使用 blockUI 来避免禁用或隐藏按钮上的浏览器不兼容。

http://malsup.com/jquery/block/#element

然后我的按钮有一个类自动按钮:

  $(".autobutton").click(
     function(event) {
        var nv = $(this).html();
        var nv2 = '<span class="fa fa-circle-o-notch fa-spin" aria-hidden="true"></span> ' + nv;
        $(this).html(nv2);
        var form = $(this).parents('form:first');

        $(this).block({ message: null });
        form.submit();                
        });   

那么一个形式是这样的:

<form>
....
<button class="autobutton">Submit</button>   
</form>
0赞 Abhijit Patra 6/29/2019 #11

按钮代码

<button id="submit" name="submit" type="submit" value="Submit">Submit</button>

禁用按钮

if(When You Disable the button this Case){
 $(':input[type="submit"]').prop('disabled', true); 
}else{
 $(':input[type="submit"]').prop('disabled', false); 
}

注意:这次您的情况可能是多个,可能需要更多条件

4赞 Manpreet 2/17/2020 #12

还想提交按钮的值并防止重复表单提交吗?

如果您使用的是submit类型的按钮,并且还想提交按钮的值(如果禁用该按钮不会发生这种情况),则可以设置表单数据属性并在之后进行测试。

// Add class disableonsubmit to your form
    $(document).ready(function () {
        $('form.disableonsubmit').submit(function(e) {
            if ($(this).data('submitted') === true) {
                // Form is already submitted
                console.log('Form is already submitted, waiting response.');
                // Stop form from submitting again
                e.preventDefault();
            } else {
                // Set the data-submitted attribute to true for record
                $(this).data('submitted', true);
            }
        });
    });
0赞 Muhammad Ali 5/8/2021 #13

简单的方法:

Javascript 和 HTML:

$('form#id').submit(function(e){
    $(this).children('input[type=submit]').attr('disabled', 'disabled');
    // this is just for demonstration
    e.preventDefault(); 
    return false;
});

<!-- begin snippet: js hide: false console: true babel: false -->
<form id="id">
    <input type="submit"/>
</form>

注意:在镀铬和边缘上完美运行。

1赞 rolinger 5/12/2021 #14

最简单的纯 javascript 解决方案是简单地禁用按钮:

<form id="blah" action="foo.php" method="post" onSubmit="return checkForm();">
  <button id="blahButton">Submit</button>
</form>

document.getElementById('blahButton').disabled = true ;

它可以与/不一起使用。形式保持可见,但没有什么可以总结的。onSubmit

1赞 h0mayun 8/1/2022 #15

就我而言,我不得不延迟一点,以便表单正确提交,然后禁用该按钮

$(document).on('submit','#for',function()
                {
                    var $this = $(this);
                    setTimeout(function (){
                        $this.find(':input[type=submit]').attr('disabled', 'disabled')
                    },1);
                });