我有一个简单的问题,关于我的javascript代码我就是这样:
$('form').submit( function (e) {
var form = $(this);
console.log('submit attempt');
$('input, select, textarea').each(function() {
var attr = $(this).attr('required');
if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '') ) {
if($(this).hasClass('numeric')) {
if(isNumber($(this).val())) {
$(form).submit();
}
}
else {
$(form).submit();
}
}
else {
e.preventDefault();
$(this).css('border','1px solid red');
}
});
});

在控制台日志中,我收到了1300条“提交尝试”消息。然后是一个错误:
未捕获RangeError:超出最大调用堆栈大小
你们有没有想过为什么会发生这种情况以及如何解决这个问题?也许关于提交的一些棘手的事情()我忘记了吗?
如果需要更多信息,请告诉我。
谢谢!
答案 0 :(得分:1)
问题是您是在提交中再次提交表单,并以递归方式调用它。这就是你应该怎么做的。如果验证失败,则isValid包含false并停止提交表单;
$('form').submit(function(e){
var isValid = true;
$('input, select, textarea').each(function() {
var attr = $(this).attr('required');
if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '') ) {
if($(this).hasClass('numeric')) {
if(!isNumber($(this).val())) {
isValid = false;
return isValid;
} else {
e.preventDefault();
$(this).css('border','1px solid red');
}
}
}
else {
e.preventDefault();
$(this).css('border','1px solid red');
isValid = false;
return isValid;
}
});
return isValid;
});
答案 1 :(得分:0)
如果没有错误,表单会随每个输入或文本区域一起提交。
因此,首先循环字段,定义是否存在故障。如果没有,请发送:
$('form').submit(function(e) {
var form = $(this);
var failure = false;
console.log('submit attempt');
$('input, select, textarea').each(function() {
var attr = $(this).attr('required');
if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '')) {
failure = true;
$(this).css('border', '1px solid red');
}
if ($(this).hasClass('numeric') && !isNumber($(this).val())) {
failure = true;
$(this).css('border', '1px solid red');
}
});
if (failure) {
e.preventDefault();
}
});