如何在点击提交按钮后禁用它?

98

我在表单末尾添加了一个提交按钮。

我已经给提交按钮添加了以下条件:

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

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


这可能不是你展示的调用的错误。请展示完整的表单HTML。 - Pekka
4
不要使用提交按钮的onclick事件-使用表单的onsubmit事件。否则,您将无法捕获键盘提交。 - Nick
19个回答

1

我认为你不需要 this.form.submit()。禁用代码应该运行,然后它会传递点击事件,这将点击表单。


1
如果您不加上“this.form.submit()”,那么在这种情况下表单将无法提交。 - Manish Champaneri
我正在使用以下代码:<button type="button" class="addb btn btn-primary rounded-pill py-2 btn-block" type="submit" data-voice_sku="'.$row["voice_sku"].'" data-voice_name="'.$row["voice_name"].'" onclick="this.disabled=true">Add to Playlist</button>。但是,如果我刷新页面,按钮就会变成可用状态。请问如何解决这个问题? - Gem

1
另一种解决方案是移动按钮而不是禁用它。在这种情况下,您就没有那些“禁用”问题了。最终,您真正想要的是让人们不要按两次,如果按钮不存在,他们就无法这样做。您也可以用另一个按钮替换它。

0

好的,我进行了大量研究,以使其完美运行。因此,最好的选择是创建一个设置超时来在单击时禁用按钮。但是,当后端正在运行提交函数时,问题就出现了。然后事件会在队列中堆积起来,每当将javascript代码“button.disabled == true”添加到onclick事件中时,只有第一个动作(即禁用按钮)会被触发,而不是在后端运行的提交操作(此后端提交函数可以包括任何内容,例如$.ajax)。

要在单击时禁用单个按钮:

function() { //i always create annonymous function to avoid polluting global 
    space
    var btn = document.getElementsByClassName("btn");
    btn.onclick = function() {
        setTimeout(function() {
            backButton.disabled = true;
        }, 0);
    };
}
}();

这段代码将禁用您的按钮,并在队列上运行该函数。timeout = 0 实际上用于触发后续的后端任务。

要禁用屏幕上的所有按钮:

(function() {
    let i, element, list, o;
    element = document.getElementsByClassName("classx");
    if (element) {
        element = element[0];
        list = element.getElementsByTagName("button");
        for (i = 0; i < list.length; i++) {
            o = list[i];
            o.onclick = function() {
                setTimeout(function() {
                    let i;
                    for (i = 0; i < list.length; i++) {
                        list[i].disabled = true;
                    }
                }, 0);
                return true;
            }
        }
    }
})();

这将帮助您禁用页面中存在的所有按钮。(根据您的用例使用它即可。) 此外,这(禁用按钮)是settimeout=0的一个很好的用例,功能描述为它将“延迟”调用,直到当前“堆叠的JavaScript事件”完成。

谢谢,希望这能帮助未来的某个人。


0

你的问题有点混乱,最好贴一些代码。不过这个应该可以解决:

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

我认为当你使用 this.form.submit() 时,它会自然地执行点击提交按钮时发生的操作。如果你想要同一页提交,你应该研究在 submitForm() 方法中使用 AJAX。

此外,在 onClick 属性值的末尾返回 false 可以抑制默认事件的触发(在这种情况下是提交表单)。


0
在这个工作示例中,用户在JavaScript中确认他真的想要中止操作。如果是真的,按钮将被禁用以防止双击,然后更新数据库的代码将运行。
<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!


0
在我的情况下是有必要的。 在表单提交时禁用提交按钮 它在Internet Explorer和Firefox上运行良好,但在Google Chrome上无法正常工作。
问题在于,在提交事件实际触发之前,您会禁用按钮。

1
通常最好在回答中展示适当的代码,而不仅仅是一个链接。 - Jordan Davis

0
更好的技巧,以便您不会失去按钮的价值是:
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)


0

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


2
这种行为似乎是特定于Ruby on Rails的。 - Edgar Ortega

-1

我成功了。当设置超时时,它可以完美地发送所有值。

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

人们会在850毫秒内点击多次。 - cweiske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接