2011-04-17 210 views
62

我写了这个代码,以禁用后点击我的网站提交按钮:禁止提交表单按钮提交

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

不幸的是,它不会发送形式。我怎样才能解决这个问题?

编辑 我想绑定的提交,而不是形式:)

回答

122

做它onSubmit()

​​

正在发生的事情是你之前完全禁用按钮实际上会触发提交事件。

您应该也许应该考虑使用ID或CLASSes命名元素,因此您不会选择页面上所有提交类型的输入。

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

(请注意,我用preventDefault()return false这样的形式并不实际提交的例子;在使用离开这一关。)

+0

是的,其实我真的想绑定所有在页面中提交。所以我不介意关于ID或CLASS的方法:)用'$('input [type = submit]')。尝试提交(function()':表单被发送,但按钮不会禁用了。 – markzzz 2011-04-17 02:36:37

+4

你需要在表单上放置'submit()',而不是输入。参见demo。 – 2011-04-17 02:37:23

+0

但是我不是问:)我想绑定提交按钮,而不是表单... – markzzz 2011-04-17 11:14:15

0

如何禁用提交按钮

只是在onclick事件上调用函数并...返回true以提交,false以禁用提交。 OR 呼叫像的window.onload函数:

window.onload = init(); 

和的init()做这样的事情:

var theForm = document.getElementById(‘theForm’); 
theForm.onsubmit = // what ever you want to do 
4

这应该照顾它在你的应用程序。

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

应该使用'.prop(“disabled”,true)'来代替。 – 2016-09-12 04:19:57

11

残疾人控件不提交它们的值不知道在帮助如果用户点击保存或删除。

因此,我将按钮值存储在一个隐藏的提交。隐藏的名称与按钮名称相同。我通过button的名称呼叫我的所有按钮。

E.g. <button type="submit" name="button" value="save">Save</button>

基于此,我找到了here。只需将点击的按钮存储在一个变量中。

$(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函数。使用或替代您自己的版本的IsNull或未定义等

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

    return is; 
} 
14

具体来说,如果有人在面临的问题的Chrome

你需要做的,解决这个问题是什么是使用的onsubmit标签中的元素设置提交按钮为禁用。这将允许Chrome在按下按钮后立即禁用按钮,并且表单提交仍将继续。

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

这不是开发人员想要的主要部分。 Javascript的东西_不应该在HTML代码中内联。可能使用'.on('submit',function(){..})'(或'.submit(function(){..})')会更好。即使在这种情况下,您可能会遇到在回调函数内部的表单上重新创建'.submit()'的问题,并导致无限循环(至少在我使用的Opera的最新版本中,应该使用与铬)。 – Kamafeather 2015-01-23 10:16:25

+0

这正是我所期待的。一个简单的内联,不需要外部库,即使JavaScript被禁用也不会阻碍。 – 2015-10-15 10:15:46

1

正如前面所说的,如果你提交按钮添加禁用属性,数据不会被发送。

从@Valamas诀窍的工作,但我找到了解决办法,这是非常容易实现:

$('#yourform').submit(function(){ 
    $('#mySubmitButton').addClass('disabled'); 
}); 

你在CSS定义禁用类这样的:

.disabled{ 
    cursor:not-allowed; 
} 

这将与disabled =“disabled”相同,但不会对发送的数据造成影响。

+5

这是不正确的,因为该按钮仍然是可点击的,并允许执行多次点击提交。 – Skuld 2016-03-17 11:35:18

+0

它只是一种风格。按钮仍然是可点击的 – Reza 2017-03-24 05:56:36

2

简单而有效的解决方案是

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

来源:here

1

你的代码实际工作在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> 
0

更简单的方法。 我试过了,工作很好。 (':input [type = submit]')。prop('disabled',true);