我一直在努力獲取多個字段的驗證以通用方式工作。我的表單有一個父跨度,其中有兩個文本字段,當一個或兩個文本字段失敗時,跨度應該用errorclass高亮顯示,在我的情況下,兩個文本字段之間有一個紅色框,當兩個字段都有效時,跨度應該不顯示。但實際的行爲是,如果第一個文本框被賦予一個有效值,jquery highlight/unhighlight函數將刪除圍繞這兩個字段的errorClass/redbox,即使第二個字段的required/regex驗證尚未通過。我寫了一個自定義的方法,併爲texboxes添加了額外的驗證規則,將tesbox分組,但沒有任何工作,我實際上是jquery的新手,無法從我現在的位置開始,所以任何幫助都是高度讚賞。Jquery - 驗證所有字段有效的多個字段(分組字段)
示例代碼在這裏
setUpValidations:函數(){
$.validator.addMethod(
'regex', function(value, element, param) {
var regex = new RegExp(param);
return regex.test(value);
}, 'Regex failed'
);
$.validator.addMethod(
'validateGroupFields', function(value, element) {
var spanElement = $(element).closest('span');
var spanChildren = listChildren(spanElement);
var result = true;
spanChildren.each(function(index, value) {
//alert("index" + index + "value" + value);
if((this).valid() == true)
{
$(this).siblings('div.errorbuble1').hide();
}else {
result = false;
}
});
return result;
}, 'Group validation failed'
);
function listChildren(element) {
var children = $(element).find(':input');
return children;
};
$.validator.setDefaults({
highlight: function(element) {
$(element).closest('span').attr('class','error');
},
unhighlight: function(element) {
$(element).closest('span').attr('class','');
},
onfocusout: function(element, event) {
if (!this.checkable(element) || !this.optional(element)) {
this.element(element);
$(element).siblings('div.errorbuble1').hide();
}
},
onfocusin: function(element) {
if((element.name in this.submitted) && !$(element).valid()){
$(element).siblings('div.errorbuble1').show();
}
},
onclick: function(element, event) {
// click on selects, radiobuttons and checkboxes
if(element.type === 'radio' || element.type === 'checkbox'){
this.element(element);
}
else if((element.name in this.submitted)){ //select
this.element(element);
}
},
});
},
onValidate : function() {
$('#form11').validate({
errorClass: 'newError',
submithandler: function(form11){
(form11).submit();
},
invalidHandler: function(form, validator) {
submitted = true;
},
rules : {
'errorIndicator2:textField3':{
required:true,
regex : {
param : /^[0-9]+$/
},
validateGroupFields: true
},
'errorIndicator2:textField4':{
required:true,
regex : {
param : /^[a-z]+$/
},
validateGroupFields: true
},
},
groups: {
nameGroup: "errorIndicator2:textField3
errorIndicator2:textField4"
},
showErrors: function(errorMap, errorList) {
this.defaultShowErrors();
if (submitted) {
$('div.errorbuble1').hide();
submitted = false;
}
},
errorElement: "div",
wrapper: "div", // a wrapper around the error message
errorPlacement: function(error, element) {
offset = element.offset();
error.addClass('errorbuble1'); // add a class to the wrapper
error.css('position', 'absolute');
error.css('left', offset.left + (element.outerWidth()) + 5);
error.css('top', offset.top + (element.outerHeight())/3);
error.insertAfter(element);
},
var submitted = false;
$(document).ready(function(){
JavaScriptValidator.setUpValidations();
JavaScriptValidator.onValidate();
$("[type=submit]").on({
click: function(event) {
JavaScriptValidator.onValidate();
}
});
});
<h3>Error box around two fields:</h3>
<span wicket:id="errorIndicator2">
<table>
<tbody><tr>
<td>Number:</td><td><input wicket:id="textField3" name="errorIndicator2:textField3" type="text"></td>
</tr>
<tr>
<td>Alpha</td><td><input wicket:id="textField4" name="errorIndicator2:textField4" type="text"></td>
</tr>
</tbody></table>
<!-- error popup div gets added here -->
你可以提供你正在使用一些樣本HTML上。可能是一個jsFiddle?我幾乎肯定你有一個'this'在你的一個函數中被誤用了。 – Qpirate
我相信這是一個帶validate插件的bug - https://github.com/jzaefferer/jquery-validation/issues/364我最終不得不使用addMethod來定製一個自定義的驗證方法,該方法對於特定的分組這些投入顯然並不理想,但當時做了這項工作。 – riscarrott