我正在尝试实现一个自定义验证函数,该函数需要一组字段全部填充或为空。我用了这个答案,一切似乎都起作用了我在本地运行它。当我把它放在tomcat服务器上并从servlet呈现时,我在IE7中运行时得到以下错误,在Firefox中它在两个实例中都工作得很好。
this.0。Form '为空或不是对象Jquery.validate.js第97行
你可以在这里找到validate插件。相关代码如下。它进入到注释行中的错误。
/*
* Form Validation
*/
$.validator.addMethod("notEmpty", function (value, element) {
return value !== "";
}, "This value cannot be empty");
$.validator.addMethod("all", function (value, element, options) {
var row = $(element).closest(options[1]);
var empties_in_group = $(options[0], row).filter(function() {
return $(this).val() === "";
}).length;
//Either all have to be empty or filled
var valid = empties_in_group === 0 || empties_in_group === $(options[0], row).length;
if (!$(element).data('reval')) {
var fields = $(options[0], row);
fields.data('reval', true).valid(); //Error happens in this line
fields.data('reval', false);
}
return valid;
}, "Either none or all fields in this section have to be filled");
$.validator.addClassRules({
percentage: {
digits: true,
min: 0,
max: 100
},
cpu_util: {all: [".cpu_util", 'tr']},
cpu_load: {all: [".cpu_load", 'tr']},
disk_used: {all: [".disk_used", 'tr']},
disk_cons: {all: [".disk_cons", 'tr']},
time_field: {all: [".time_field", 'li']},
log_msgs: {all: [".log_msgs", 'li']},
log_unchng: {all: [".log_unchng", 'td']},
log_ex: {all: [".log_ex", 'td']},
mem_free: {all: [".mem_free", 'tr']},
mem_used: {all: [".mem_used", 'tr']},
cpu_mem: {all: [".cpu_mem", 'tr']},
cpu_util: {all: [".cpu_util", 'tr']},
swap: {all: [".swap", 'tr']}
});
任何想法?
编辑:文件在头文件中加载:
<head>
<link rel="stylesheet" type="text/css" href="<rootfolder>/css/style.css"/>
<script type="text/javascript" src="<rootfolder>/js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="<rootfolder>/js/jquery.timebox.js"></script>
<script type="text/javascript" src="<rootfolder>/js/jquery.validate.js"></script>
<script type="text/javascript" src="<rootfolder>/js/jquery.qtip.min.js"></script>
<script type="text/javascript" src="<rootfolder>/js/script.js"></script>
</head>
script js中的Javascript是这样加载的:
$(document).ready(function() {
<JQUERY AND JAVASCRIPT THINGS>
});
编辑2:我也尝试了javascript在body的底部,它仍然有相同的错误。
jquery不呈现在服务器端。原始javascript文件被推送到客户端,客户端浏览器执行您编写的任何代码,所有这些都不需要服务器的帮助。
所以除非tomcat在发送到客户端之前重写了代码,否则我严重怀疑这是因为服务器端问题。
如果您需要做的只是确保填满了必需的字段。然后代码很简单,省去了复杂的插件。你所需要做的就是像这样:
注意:简单的版本,它所做的就是确保是否有输入。
function validateForm() {
var req = $('.required');
$.each(req, function(index, value){
if($(value).val() != null && $(value).val().length < 1){
markError($(value), "Cannot be empty");
error=true;
} else {
unmarkError($(value));
}
});
function markError(ele, msg) {
$(ele).prev().addClass("alert");
var msgSpan = $(ele).next('span.errorMsg');
if(msgSpan.length > 0) {
$(msgSpan).text(msg);
} else {
$(ele).after("<span class='errorMsg'>"+msg+"</span>");
}
}
function unmarkError(ele) {
$(ele).prev().removeClass("alert");
$(ele).next('span.errorMsg').remove();
}
}
我用CSS类required
获取所有字段并检查它们的值。我在表单submit上执行以下代码:
<form .... onSubmit="return validateForm()" >
我一直在ie8,最新的FF和Chrome中测试我的MVC应用程序,一切都很好。当我试着用ie7标准运行IE时,很多东西都不起作用,包括一些jquery验证。
问题正是错误消息中所述的,表单为空。
在我的例子中发生的事情是,我正在验证这样的表单
var form = $("#divThatWrapsTheForm #Form"); //changed this line
form.removeData("validator");
$.validator.unobtrusive.parse(form);
if (!$(form).valid()) {
return;
}
显然,IE 7不喜欢我定义表单变量的方式,所以我像这样修复它:
var form = $("#divThatWrapsTheForm").children("#Form"); //to this
form.removeData("validator");
$.validator.unobtrusive.parse(form);
if (!$(form).valid()) {
return;
}