【问题标题】:Prevent form from submitting multiple times防止表单多次提交
【发布时间】:2016-11-18 16:25:03
【问题描述】:

我有一些代码试图阻止表单被多次提交。我在另一个堆栈线程上找到了这段代码,但它不起作用。相反,它会无限次提交表单并滞后于整个服务器!

$(document).ready(function() {
    $('form').submit(function() {
        console.log("hi")
        if ($(this).valid()) {
            $(this).submit(function(){
                return false;
            });
            return true; //Tried with an without
        }
    });
});

这是控制台中输出的图片:

这样继续提交表单。我只是在那个号码拍了一张照片。

我从上面找到代码的线程是this question 上的公认答案,它有很多赞成票。

请注意,我每页有多个表单,并且许多页面包含许多表单!一种特定形式的解决方案是不够的。我需要一个全球解决方案。我也在使用 Codeigniter。

【问题讨论】:

  • 这将导致无限循环,(1),因为您检查事件表单的提交,(2),然后在您提交的表单中,返回(1)。尝试摆脱 submit() 回调,并将代码附加到一个简单的按钮。

标签: javascript jquery html forms


【解决方案1】:

尝试传入事件并使用 e.preventDefault()

$(document).ready(function() {
    $('form').submit(function(e) {
        e.preventDefault();
        console.log("hi")
        if ($(this).valid()) {
            $(this).submit(function(){
                return false;
            });
        }
    });
});

【讨论】:

  • 还是多次提交。
【解决方案2】:

如果我错了,请纠正我,但如果它有效,你不应该只是 return;,否则像 jQuery 文档的 example 那样停止提交。

$(document).ready(function() {
    $('form').submit(function(event) {
        console.log("hi")
        if ($(this).valid()) {
            return;
        }
        event.preventDefault();
    });
});

【讨论】:

    【解决方案3】:

    您需要取消初始表单提交,以便仅在验证后执行。但坦率地说,如果表单无效,HTML5 将不会提交,因此您的代码似乎是多余的。

    这是一个工作示例,它将大部分 JQuery 排除在外。它只提交一次表单。

    你也可以在这里测试:https://jsfiddle.net/5oyp6aa0/6/

    $(function() {
        var theForm = document.querySelector("form");
        theForm.addEventListener("submit",function(evt) {
            // First, cancel the form's submission:
            evt.preventDefault();
            evt.stopPropagation();
            console.log("Navitve Submit Cancelled")
            if (theForm.checkValidity()) {
                // Then, only if it's valid, submit
                console.log("Manual Submit Triggered");
                theForm.submit();
            }
        });
    
    });
    

    【讨论】:

    • evt.preventDefault is not a function. evt 在错误的函数中哈哈。我会再测试一次。
    • @RoryMcCrossan 谢谢。还没醒!
    • 它仍然提交多次。在 5 秒内提交超过一千次。
    • @Nic 尝试更新的答案。而不是再次重新定义提交事件处理函数,这只是在表单有效时提交。
    • 不幸的是它仍然这样做:S
    【解决方案4】:

    在这些答案都不起作用后,我决定再试一次。这对我有用。

    $(document).ready(function() {
        $("form").submit(function (e) {
            var attr = $(this).attr('submitted');
            if (typeof attr === typeof undefined || attr === false) {
                if ($(this).valid()) {
                    $(this).attr('submitted', 'submitted');
                    $(this).submit();
                } else {
                    e.preventDefault();
                }
            } else {
                e.preventDefault();
            }
        });
    });
    

    【讨论】:

    • 如果两个 else 都分支,你可以摆脱它。您不需要对所有内容都投反对票。如果事实如此,您可以将您的答案标记为已接受。
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多