我正在尝试学习如何验证表单,我遇到了这个问题:
当我运行此代码并且我没有输入任何内容时 - 表单不应该发送,但确实如此。我的问题是......为什么,我该如何解决?
html:
<form method="post" action="#">
<fieldset>
<legend>Formular</legend>
<label for="name">Name: </label>
<input type="text" class="required" name="name" value="" />
<br /><br />
<label for="pass">Password: </label>
<input type="password" class="required" name="pass" value="" />
<br /><br />
<input type="submit" value="Submit!" />
</fieldset>
</form>
jQuery:
$('#obal form').submit(function() {
$('.required').each(function() {
if($(this).val() == "") {
if (errorCount === undefined) {
var errorCount = 1;
} else {
++errorCount;
}
}
});
if (errorCount > 0) {
window.alert( 'You didnt pass' );
return false;
} else {
return true;
}
});
如果您知道代码可能采取的任何其他改进,您可以告诉我,谢谢..: - )
答案 0 :(得分:3)
改变这个:
$('#obal form').submit(function() {
到此:
$('#obal form').submit(function(event) {
event.preventDefault();
如果您的表单有效,请执行此操作(在.submit函数中):
$(this).submit();
并且您的表单将被提交。
答案 1 :(得分:3)
您当前的代码无效,因为errorCount是传递给每个方法的匿名函数的本地代码。它在外面是不可见的。
这意味着当您在每个方法之后执行errorCount > 0
时,它会计算为false并提交表单。
我会把它写成你的函数,
$('#obal form').submit(
function(ev)
{
var errorCount = 0; //define your errorCount variable to zero before you
//iterate using each, errorCount will be available inside your each iteration function.
$('.required').each(
function()
{
//Due to JavaScript clousures, you can access errorCount in this function.
if($(this).val() === '')
errorCount++;
}
);
//If we don't find any errors, we return. This will let the browser continue submitting the form.
if(errorCount == 0)
return;
//If control comes here, it means there were errors. Prevent form submission and display error message.
ev.preventDefault();
alert('Validation failure.');
}
);
编辑:
让我们给传递给'.each'方法的匿名函数(比如myEachLoop)命名。
$('#obal form').submit(function() {
$('.required').each(
function myEachLoop ()
{
if($(this).val() == "") {
if (errorCount === undefined) {
var errorCount = 1; //you have defined the errorCount which is 'local' to the 'myEachLoop' function. Once myEachLoop function is over. errorCount variable is gone!
} else {
++errorCount;
}
}
});
//errorCount is 'undefined' here because the previously defined errorCount variable is gone.
if (errorCount > 0) {
window.alert( 'You didnt pass' );
return false;
} else {
return true;
}
});
您现在看到代码中的错误吗?
您还需要了解JavaScript闭包,以了解我的代码工作原理。
答案 2 :(得分:0)
您可能想尝试这个jQuery plugin。它非常灵活且易于使用。
答案 3 :(得分:0)
我会在循环之前声明错误计数以确保范围正确:
var errorCount = 0;
$('.required').each(function() {
if($(this).val() == "") {
errorCount++;
}
});