JQuery Validate: как проверить элемент неформы?
У меня есть форма, которая имеет прикрепленную карту. Нажатие на карту добавляет скрытые вложения в div в форме.
Я хочу, чтобы правило проверки проверяло, есть ли у этого div какие-либо скрытые элементы. До сих пор я мог только сделать это с помощью фиктивного элемента, который мне нужно удалить вручную перед отправкой формы:
<form action="..." method="post" id="signup">
<!-- ... -->
<div id="zones_selected"><input type="hidden" name="dummy"></div>
<!-- ... -->
</form>
$.validator.methods.zones = function (value, element, param) { return ($zone_holder.find('input[name!=dummy]').length > 0); };
$('#signup').validate({
rules: {
//...
'dummy': 'zones'
},
//...
submitHandler: function(form) { $(form).find('input[name=dummy]').remove(); form.submit(); }
});
Однако это оставляет желать лучшего для размещения ошибок, так как мой пользовательский метод проверки достоверности никогда не запускает функцию unhighlight
, и я чувствую себя грязным за то, что внес свой вклад только для проверки формы (не очень ненавязчивый).
Что бы я хотел, это не лишний submitHandler
и правило для проверки наличия скрытых входов в div, у которого будет триггер unhighlight
(например, если пользователь делает клик по карте), что создает новый скрытый вход - сообщение, которое я показываю, чтобы они это сделали, исчезнет).
Какой лучший способ выполнить это?
Ответы
Ответ 1
Я пытался это сделать в прошлом. Я не верю, что есть способ сделать это, не внося никаких изменений в базу кода jquery.validator.
При просмотре JQuery.Validator.js, проверьте "элементы" на ln 423, вы увидите что-то вроде этого
return $([]).add(this.currentForm.elements)
.filter(":input")
.not(":submit, :reset, :image, [disabled]")
.not( this.settings.ignore )
.filter(function() {
!this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
// select only the first element for each name, and only those with rules specified
if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
return false;
rulesCache[this.name] = true;
return true;
});
Фильтр ( ": input" ) - это то, что даст вам печаль.