[英]jQuery Validate - Add Error Class to Parent Div
我正在使用jQuery Validate插件,並且永遠找不到顯示復選框錯誤的好方法。 如果沒有選中,我想以紅色突出顯示所有復選框標簽,並決定通過向包含復選框和復選框標簽的div添加錯誤類來執行此操作。 但是,它似乎沒有添加類。 我沒有正確選擇div嗎?
HTML:
<div class="left-aligned indent">
<label id="id_label" for="id" class="label">Items:</label>
<div class="select-group">
<input type="checkbox" name="items" value="1" id="item_1" />
<label class="checkbox">Item #1</label><br />
<input type="checkbox" name="items" value="1" id="item_2" />
<label class="checkbox">Item #2</label><br />
<input type="checkbox" name="items" value="1" id="item_3" />
<label class="checkbox">Item #3</label><br />
</div>
</div>
使用Javascript:
$().ready(function() {
$('#addForm').validate({
rules: {
"items": {
required: true,
minlength: 1
}
},
errorPlacement: function(error, element) {
if (element.is(':checkbox')) {
$(this).prev("div").addClass('checkbox-error');
}
else {
return true;
}
}
});
});
CSS:
.error {
background-color: #FF898D;
border: 1px solid #000;
}
.checkbox-error {
color: #FF898D;
}
這應該工作:
$('#myform').validate({
highlight: function(element) {
$(element).parent().addClass("field-error");
},
unhighlight: function(element) {
$(element).parent().removeClass("field-error");
}
});
查看文檔以獲取更多選項:
$(element).parent('div').addClass('checkbox-error');
從我在使用jquery驗證發生驗證錯誤時將類添加到父div的答案,因為我相信它為這個問題的現有答案增加了價值......
第一項業務是修改表單驗證器上的settings
對象。 您可以通過以下任何方式執行此操作:
jQuery.validator.setDefaults()
為所有表單加載表單之前 .validate([options])
入選項來初始化表單時 $("form").data("validator").settings
上的驗證器對象 由於您使用的是MVC,選項#2是不可能的,因為不顯眼的驗證會自動初始化表單。 所以讓我們繼續使用選項3 - 這里的目標只是為了能夠自定義表單上的設置。
我們要修改的默認方法是highlight
和unhighlight
,它們將分別突出顯示無效字段或還原高亮選項所做的更改。 根據源代碼,這是他們的默認行為:
highlight: function( element, errorClass, validClass ) {
if ( element.type === "radio" ) {
this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
} else {
$( element ).addClass( errorClass ).removeClass( validClass );
}
},
unhighlight: function( element, errorClass, validClass ) {
if ( element.type === "radio" ) {
this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
} else {
$( element ).removeClass( errorClass ).addClass( validClass );
}
}
所以你在這里也有幾個選擇。
這條路很容易。 只要在那里寫下你想要的任何東西。 也許來自源代碼的種子,也許做自己的事情。
var valSettings = $("form").data("validator").settings
valSettings.highlight = function(element, errorClass, validClass) { ... }
valSettings.unhighlight = function(element, errorClass, validClass) { ... }
這種侵入性較小,因此在大多數情況下可能更為可取。
由於最終您將替換valSettings.highlight
的值, valSettings.highlight
您需要訪問原始函數的干凈原始版本。 您可以保存自己的,也可以從全局默認值中刪除一個
// original highlight function
var highlightOriginal = $("form").data("validator").settings.highlight;
var highlightDefaults = $.validator.defaults.highlight
在包裝的JavaScript函數而言,有幾個例子在這里 , 在這里 ,和這里 )。 以下是其中一個示例的解析示例,它將幫助跨函數調用綁定this
上下文,保留傳遞的參數的arity,並保留返回值:
function wrap(functionToWrap, beforeFunction) {
return function () {
var args = Array.prototype.slice.call(arguments),
beforeFunction.apply(this, args);
return functionToWrap.apply(this, args);
};
};
然后,您還必須快速定義在調用時要觸發的任何其他行為。 在這種情況下,讓我們找到最接近元素的父div
並更新它的類,如下所示:
function highlightDecorator(element, errorClass, validClass) {
$(element).closest("div").addClass(errorClass).removeClass(validClass);
}
全部包裝 (看看我在那里做了什么)
$(function () {
var valSettings = $("form").data("validator").settings
valSettings.highlight = wrap($.validator.defaults.highlight, highlightDecorator)
valSettings.unhighlight = wrap($.validator.defaults.unhighlight, unhighlightDecorator)
});
function wrap(functionToWrap, beforeFunction) {
return function () {
var args = Array.prototype.slice.call(arguments);
beforeFunction.apply(this, args);
return functionToWrap.apply(this, args);
};
};
function highlightDecorator(element, errorClass, validClass) {
$(element).closest("div").addClass(errorClass).removeClass(validClass);
}
function unhighlightDecorator(element, errorClass, validClass) {
$(element).closest("div").addClass(validClass).removeClass(errorClass);
}
因此,當我們結合所有上述函數時,它應該看起來像這樣:
$(function () { var valSettings = $("form").data("validator").settings valSettings.highlight = wrap($.validator.defaults.highlight, highlightDecorator) valSettings.unhighlight = wrap($.validator.defaults.unhighlight, unhighlightDecorator) }); function wrap(functionToWrap, beforeFunction) { return function () { var args = Array.prototype.slice.call(arguments); beforeFunction.apply(this, args); return functionToWrap.apply(this, args); }; }; function highlightDecorator(element, errorClass, validClass) { $(element).closest("div").addClass(errorClass).removeClass(validClass); } function unhighlightDecorator(element, errorClass, validClass) { $(element).closest("div").addClass(validClass).removeClass(errorClass); }
input.input-validation-error { border: solid 1px red; } .input-validation-error label { color: red; }
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"></script> <form action="/Person" method="post"> <div class="required"> <label for="Name">Name <em>*</em></label> <input id="Name" name="Name" type="text" value="" data-val="true" data-val-required="The Name field is required."/> <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span> </div> <input type="submit" value="Save" /> </form>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.