Javascript jQuery promise()超出了最大调用堆栈大小

Javascript jQuery promise()超出了最大调用堆栈大小,javascript,jquery,promise,Javascript,Jquery,Promise,我试图在jQuery中应用一个简单的表单验证。如果表单字段为空,请添加一个类error。如果任何字段为空,请不要提交。我有以下资料: $('#contact-form').submit(function(event) { event.preventDefault(); var formValid = true; $('input.required, textarea.required, select.required').each(function() {

我试图在jQuery中应用一个简单的表单验证。如果表单字段为空,请添加一个类
error
。如果任何字段为空,请不要提交。我有以下资料:

$('#contact-form').submit(function(event) {
    event.preventDefault();

    var formValid = true;
    $('input.required, textarea.required, select.required').each(function() {
        if($(this).val() === '') {
            formValid = false;
            $(this).addClass('error');
        } else {
            $(this).removeClass('error');
        }
    }).promise().done(function() {
        if(formValid) {
            $('#contact-form').submit();
        }
    });
});
然而,当代码到达提交表单的行时,我看到一个JavaScript错误:


未捕获范围错误:超过了最大调用堆栈大小

需要验证多少字段,以及为什么承诺与每个字段关联?检查所有字段后重试

if(formValid) {
            $('#contact-form').submit();
        }
else return false

您必须验证多少个字段,为什么每个字段都与承诺关联?检查所有字段后重试

if(formValid) {
            $('#contact-form').submit();
        }
else return false

如果表单有效,代码将如何运行:

  • 提交时,阻止默认操作
  • 检查字段
  • 如果它们有效,则form.submit-这会导致提交事件,转到步骤1
  • 无穷递归

    这非常简单,因为处理程序中没有异步代码

    $('#contact-form').submit(function(event) {
        var formValid = true;
        $('input.required, textarea.required, select.required').each(function() {
            if($(this).val() === '') {
                formValid = false;
                $(this).addClass('error');
            } else {
                $(this).removeClass('error');
            }
        });
        if (!formValid) {
            event.preventDefault();
        }
    });
    

    如果表单有效,代码将如何运行:

  • 提交时,阻止默认操作
  • 检查字段
  • 如果它们有效,则form.submit-这会导致提交事件,转到步骤1
  • 无穷递归

    这非常简单,因为处理程序中没有异步代码

    $('#contact-form').submit(function(event) {
        var formValid = true;
        $('input.required, textarea.required, select.required').each(function() {
            if($(this).val() === '') {
                formValid = false;
                $(this).addClass('error');
            } else {
                $(this).removeClass('error');
            }
        });
        if (!formValid) {
            event.preventDefault();
        }
    });
    
    首先,可以清除
    .promise().done(…)
    。如前所述,没有发生任何异步情况

    除此之外,实际问题很可能是重复重新调用提交处理程序

    尝试POJS(与jQuery相反)表单提交:

    if(formValid) {
        this.submit();
    }
    
    首先,可以清除
    .promise().done(…)
    。如前所述,没有发生任何异步情况

    除此之外,实际问题很可能是重复重新调用提交处理程序

    尝试POJS(与jQuery相反)表单提交:

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


    我怀疑这是因为你在每个领域都做出了承诺。不管怎样,有承诺的目的是什么?我在代码中没有看到异步操作。承诺告诉我
    .each()
    何时完成。@贾斯汀:没有,
    。each()
    是一个同步函数。当您到达下一行代码时,它就完成了。你不需要也不应该为此使用承诺。(更多细节见下面的答案。)我怀疑这是因为你在每个领域都创造了承诺。不管怎样,有承诺的目的是什么?我在代码中没有看到异步操作。承诺告诉我
    .each()
    何时完成。@贾斯汀:没有,
    。each()
    是一个同步函数。当您到达下一行代码时,它就完成了。你不需要也不应该为此使用承诺。(更多细节见下面的答案。)啊,这就是问题所在。那么,我如何绑定
    .submit()
    ,然后才能
    submit()
    ,而不必重新输入绑定?@WillianValhakis回答-虽然我不喜欢他的返回false而不是
    preventDefault()
    -这部分是错误的这是关闭的,但需要单击表单提交按钮两次。第一次单击并没有提交表单。hmmm,这就像在调用submit之前没有删除事件处理程序一样-我讨厌jQuery内部-编辑为使用
    setTimeout
    -使用它看起来总是像一个黑客,但是…在
    form.submit()周围添加
    setTimeout()。还是要点击两次。哈哈,这太荒谬了。谢谢你的帮助。啊,这就是问题所在。那么,我如何绑定
    .submit()
    ,然后才能
    submit()
    ,而不必重新输入绑定?@WillianValhakis回答-虽然我不喜欢他的返回false而不是
    preventDefault()
    -这部分是错误的这是关闭的,但需要单击表单提交按钮两次。第一次单击并没有提交表单。hmmm,这就像在调用submit之前没有删除事件处理程序一样-我讨厌jQuery内部-编辑为使用
    setTimeout
    -使用它看起来总是像一个黑客,但是…在
    form.submit()周围添加
    setTimeout()。还是要点击两次。哈哈,这太荒谬了。谢谢你的帮助。提交处理程序仍然会被调用,不管提交是如何调用的。好吧,我学到了一些东西!我真的认为你错了:从一开始,浏览器就是这样的。尽管W3C建议中仍然没有这种行为。我还没有遇到不符合要求的浏览器。提交处理程序仍然会被调用,无论提交是如何调用的。好吧,我学到了一些东西!我真的认为你错了:从一开始,浏览器就是这样的。尽管W3C建议中仍然没有这种行为。我还没有遇到不符合要求的浏览器。