Javascript jQuery promise()超出了最大调用堆栈大小
我试图在jQuery中应用一个简单的表单验证。如果表单字段为空,请添加一个类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() {
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
如果表单有效,代码将如何运行:
$('#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();
}
});
如果表单有效,代码将如何运行:
$('#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建议中仍然没有这种行为。我还没有遇到不符合要求的浏览器。