提问人:Akira Dawson 提问时间:3/21/2014 最后编辑:Akira Dawson 更新时间:5/14/2015 访问量:64816
为什么 jQuery Validation 要添加 noValidate 属性?
Why is jQuery Validation adding noValidate attribute?
问:
我目前正在使用:
<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<script src="../js/bootStrap/js/bootstrap.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/additional-methods.min.js"></script>
通过以下验证:
j$('.delValidate').each(function(){
j$(this).validate({
rules:{
delivery_Method:{
required: true
}
},
message:{
delivery_Method:{
required: true
}
}
});
});
j$('.validateUser').each(function(){
j$(this).validate({
rules:{
f_Name:{
required: true
},
l_Name:{
required: true
},
username:{
required: true,
minlength: 6
},
password: {
validChars: true,
noSpace: true,
minlength: 6,
skip_or_fill_minimum: [3,".pw"]
},
confPass: {
equalTo: "#password",
skip_or_fill_minimum: [3,".pw"]
}
}
});
});
HTML 片段:
<form class="form-horizontal delValidate" action="#" method="post">
<input type="hidden" name="formIdentifier" value="addDel" />
<div class="form-group">
<div class="col-sm-3">
<input type="text" name="delivery_Method" class="form-control" placeholder="Enter new method" />
</div>
<div class="col-sm-2 col-sm-offset-2">
<button type="submit" class="btn btn-default btn-block">Add</button>
</div>
</div>
</form>
但是当我转到我的页面时,我的表单是使用属性noValidate呈现的,因此我可以将null/空值插入数据库。这是什么原因? 表单是否必须以特定方式设置? jQuery验证是否发现某些错误,因此不起作用? 我的肮脏工作是使用:
j$(this).removeAttr('novalidate');
答:
该属性只是告诉浏览器禁用内置的 HTML5 验证,或忽略您可能使用过的任何 HTML5 验证属性。novalidate
jQuery Validate 插件会动态添加该属性,因为通过安装它,您决定让插件处理验证而不是 HTML5。novalidate
这两种方法(JavaScript (jQuery) 或 HTML5)都不足以保护数据库。当客户端验证失败、被禁用或被用户/浏览器绕过时,您应该始终进行某种服务器端验证。
引用OP:
“我的表单是使用属性noValidate呈现的,因此我可以将null/空值插入数据库。”
听起来您使用 jQuery Validate 插件的方式有问题,并且该属性不是根本原因。novalidate
如果无法输入数据至关重要,则需要在服务器端使用数据验证代码来防止这种情况发生。绝不能依赖客户端代码来保护数据库,因为所有客户端代码都可以轻松绕过。null
“这是什么原因?”
如上所述。这是正常的,也是需要的。该插件仅用于从浏览器 (HTML5) 接管客户端验证。novalidate
如果您没有 HTML5 验证属性,那么该属性或缺少属性绝对不会执行任何操作。换言之,仅当您使用 HTML5 验证属性时,它才会切换 HTML5 验证。novalidate
novalidate
“表单是否必须以特定方式设置?”
是的。但是我们无法看到您的标记来判断您哪里出错了。
“我的肮脏工作是使用:
.removeAttr('novalidate')
”
这并不聪明,或者完全是多余的,具体取决于您的标记。实际上,您可能允许 HTML5 验证与 jQuery Validate 插件同时进行。选择一个或另一个进行客户端验证。
编辑:
此后,OP 在问题中添加了一些 HTML 标记。
jQuery Validate 插件完全按预期工作: http://jsfiddle.net/tv7Bz/
评论