ChatGPT解决这个技术问题 Extra ChatGPT

单击后如何禁用提交按钮?

我在表单末尾有一个提交按钮。

我在提交按钮中添加了以下条件:

onClick="this.disabled=true;
this.value='Sending…';
this.form.submit();"

但是当它移动到下一页时,没有传递参数并且传递了空值。

这可能不是您显示的电话的错。请显示表格的完整 HTML。
不要使用提交按钮的 onclick 事件 - 使用表单的 onsubmit 事件。否则,您将无法从键盘捕获提交。

A
Andreas Köberle

您应该首先提交表单,然后更改提交的值:

onClick="this.form.submit(); this.disabled=true; this.value='Sending…'; "

这是最好的答案。一些浏览器不知道事先提交表单,这个解决方案可以解决这个问题。
onclick 应该是小写的
如果首先触发 HTML5 验证,将无法按预期工作。
对我来说,'this.disabled=true' 会阻止后端函数触发,即使它出现在提交之后!为了解决这个问题,我实现了一个 bool 值和 if 语句来检查第一次或后续点击,并为后续返回 false。
使用 ASP.NET 更新面板我禁用了提交行为。 'OnClick="btnSave_Click" OnClientClick="this.disabled=true; this.value='正在保存...请稍候。';" UseSubmitBehavior="false"'
m
migajek

可能您要提交两次表单。删除 this.form.submit() 或在末尾添加 return false

你应该以 onClick="this.disabled=true; this.value='Sending…';" 结束


小心,因为这在 IE8 和 Chrome 中不起作用......它的工作原理是它按照脚本所说的去做,但结果是它也禁用了表单的提交。
查看@andreaskoberle 的回答
对于 button type=submit 标记,将 this.value 替换为 this.innerText
@Andreas Köberle 下面的答案更好,尤其是在使用任何 ASP.NET 框架的情况下。
它的 2022 年,这个解决方案在 Chrome 102.0.5005.115 上完美运行
佚名

在 IE11、FF53、GC58 上测试:

onclick="var e=this;setTimeout(function(){e.disabled=true;},0);return true;"

这应该被接受;其他人不发送表格
这很好用,但是单击时如何更改“值”?
A
A-Sharabiani

您需要在 <form>onsubmit 事件中禁用按钮:

<form action='/' method='POST' onsubmit='disableButton()'>
    <input name='txt' type='text' required />
    <button id='btn' type='submit'>Post</button>
</form>

<script>
    function disableButton() {
        var btn = document.getElementById('btn');
        btn.disabled = true;
        btn.innerText = 'Posting...'
    }
</script>

注意:如果您有一个具有 required 属性的表单元素,这种方式将起作用。


A
AlexV

提交表单时,禁用的 HTML 表单元素不会与 post/get 值一起发送。因此,如果您在单击后禁用提交按钮并且此提交按钮设置了 name 属性,则不会在 post/get 值中发送它,因为该元素现在已禁用。这是正常行为。

克服这个问题的方法之一是使用隐藏的表单元素。


F
Frenchi In LA

诀窍是延迟禁用按钮,并提交您可以使用的表单 window.setTimeout('this.disabled=true',0); 是的,即使 0 MS 正在工作


但是如果用户在那段时间内按下按钮怎么办?
M
Manie

使用 JQuery,你可以做到这一点..

$("#submitbutton").click(
   function() {
      alert("Sending...");
      window.location.replace("path to url");
   }
);

请不要为此使用 alerts,它们会阻止页面直到被点击
B
BalusC

如果您禁用该按钮,那么它的 name=value 对确实不会作为参数发送。但是应该发送剩余的参数(只要它们各自的输入元素和父表单没有被禁用)。可能您只测试按钮或其他输入字段甚至表单被禁用?


s
stephen.hanson

这是一个扩展 Andreas Köberle 解决方案的示例。它使用 jQuery 作为事件处理程序和文档就绪事件,但可以将它们切换为纯 JS:

(function(document, $) {

  $(function() {
    $(document).on('click', '[disable-on-click], .disable-on-click', function() {
      var disableText = this.getAttribute("data-disable-text") || 'Processing...';

      if(this.form) {
        this.form.submit();
      }

      this.disabled = true;

      if(this.tagName === 'BUTTON') {
        this.innerHTML = disableText;
      } else if(this.tagName === 'INPUT') {
        this.value = disableText;
      }
    });
  });

})(document, jQuery);

然后它可以像这样在 HTML 中使用:

<button disable-on-click data-disable-text="Saving...">Click Me</button>
<button class="disable-on-click">Click Me</button>
<input type="submit" disable-on-click value="Click Me" />

我喜欢这个解决方案,因为它遵循“不要重复自己”(DRY)原则。添加第一个块后,您可以简单地通过使用一个类来重新使用它。
M
Mitch Dempsey

我认为您不需要this.form.submit()。禁用代码应该运行,然后它将传递单击表单的单击。


如果您不输入“this.form.submit()”,那么在这种情况下表单将不会提交。
我正在使用 如果我刷新页面禁用消失,如何解决这个问题?
D
Desarrollo Aplicaciones

我使用的另一个解决方案是移动按钮而不是禁用它。在这种情况下,您没有那些“禁用”问题。最后,您真正想要的是人们不要按两次,如果按钮不存在,他们就无法做到。

您也可以用另一个按钮替换它。


M
Manuel
function xxxx() {
// submit or validate here , disable after that using below
  document.getElementById('buttonId').disabled = 'disabled';
  document.getElementById('buttonId').disabled = '';
}

T
TJ Koblentz

您的问题令人困惑,您确实应该发布一些代码,但这应该可以:

onClick="this.disabled=true; this.value='Sending...'; submitForm(); return false;"

我认为当您使用 this.form.submit() 时,它会在您单击提交按钮时自然发生。如果您想要同页提交,您应该考虑在 submitForm() 方法(如上)中使用 AJAX。

此外,在 onClick 属性值的末尾返回 false 会禁止触发默认事件(在本例中是提交表单)。


M
Mike

    A better trick, so you don't lose the value of the button is

    function showwait() {
    document.getElementById('WAIT').style['display']='inline';
    document.getElementById('BUTTONS').style['display']='none';
    }

包装代码以显示在 div 中

id=WAIT style="display:none"> 要显示的文本(结束 div)

包装代码以隐藏在 div 中

id=BUTTONS style="display:inline"> ... 按钮或任何用 onclick="showwait();" 隐藏的东西(结束 div)


C
Community

就我而言,这是需要的。

Disable submit button on form submit

没有它,它在 Internet Explorer 和 Firefox 中运行良好,但在 Google Chrome 中无法运行。

问题是您在实际触发提交事件之前禁用了按钮。


在您的答案中显示适当的代码通常是一种好习惯,而不仅仅是一个链接。
c
chaitanya

我认为禁用按钮的简单方法是 :data => { disable_with: "Saving.." } 这将提交一个表单,然后禁用按钮,如果您有任何验证,例如 required = 'required'.,它也不会禁用按钮


这种行为似乎是 Ruby on Rails 特有的。
P
Pierre-David Sabourin

在这个工作示例中,用户在 JavaScript 中确认他确实想要中止。如果为 true,则禁用该按钮以防止双击,然后运行更新数据库的代码。

<asp:button id="btnAbort" runat="server" OnClick="btnAbort_Click" OnClientClick="if (!abort()) {return false;};" UseSubmitBehavior="false" text="Abort" ></asp:button>

我遇到了问题,因为 .net 可以更改按钮的名称

function abort() {
    if (confirm('<asp:Literal runat="server" Text="Do you want to abort?" />')) {
        var btn = document.getElementById('btnAbort');
        btn.disabled = true;
        btn.innerText = 'Aborting...'
        return true;
    }
    else {
        return false;
    }  
}

因为您使用 OnClientClick 覆盖 OnClick,所以即使您的验证方法成功,后面的代码也不会工作。这就是您将 UseSubmitBehavior 设置为 false 以使其工作的原因

PS:如果您的代码在 vb.net 中,则不需要 OnClick!


H
Hasan Tuna Oruç

我成功了。设置超时后,它可以完美运行并发送所有值。

    $(document).ready(function () {
        document.getElementById('btnSendMail').onclick = function () {
            setTimeout(function () {
                document.getElementById('btnSendMail').value = 'Sending…';
                document.getElementById('btnSendMail').disabled = true;
            }, 850);
        }
    });

人们会在 850 毫秒内点击几次