Так что я собираюсь немного глубже понять, почему это не работает, потому что я такой человек, который не может спать по ночам, не зная, ха-ха.Я использую jQuery validate 1.10 и Microsoft jQuery Unobtrusive Validation 2.0.20710.0, который был опубликован 1/29 / 2013.
Я начал с поиска метода setDefaults в jQuery Validate и нашел его в строке 261Унифицированный файл.Все, что действительно делает эта функция, - это объединяет ваши настройки json с существующими $.validator.defaults
, которые инициализируются со свойством ignore, установленным в значение «: hidden», вместе с другими значениями по умолчанию, определенными в jQuery Validate.Так что на данный момент мы переопределены игнорировать.Теперь давайте посмотрим, где на это свойство по умолчанию ссылаются.
Когда я проследил код, чтобы увидеть, куда ссылается $.validator.defaults
.Я заметил, что он используется конструктором только для валидатора формы, строка 170 в jQuery validate unminified file.
// constructor for validator
$.validator = function( options, form ) {
this.settings = $.extend( true, {}, $.validator.defaults, options );
this.currentForm = form;
this.init();
};
В этот момент валидатор объединит все настройки по умолчанию и прикрепит его квалидатор формы.Когда вы смотрите на код, выполняющий проверку, выделение, выделение и т. Д., Все они используют объект validator.settings, чтобы получить свойство ignore.Поэтому нам нужно убедиться, что если мы установим игнорирование с помощью метода setDefaults, то это должно произойти до вызова $ ("form"). Validate ().
Если выиспользуя Asp.net MVC и ненавязчивый плагин, вы поймете, посмотрев javascript, что validate вызывается в document.ready. Я также вызвал мои setDefaults в блоке document.ready, который будет выполнятьсяпосле сценариев jquery проверяет и ненавязчив, потому что я определил эти сценарии в html перед тем, в котором есть вызов.Таким образом, мой вызов, очевидно, не повлиял на функциональность по умолчанию пропуска скрытых элементов во время проверки.Здесь есть несколько вариантов.
Вариант 1 - Вы могли, как указал Хуан Мелладо, иметь вызов вне документа .ready, который будет выполняться, как только скрипт будет загружен,Я не уверен насчет сроков, поскольку браузеры теперь могут выполнять параллельную загрузку скриптов.Если я просто слишком осторожен, поправьте меня.Кроме того, возможно, есть способы обойти это, но для своих нужд я не пошел по этому пути.
Вариант 2a - Безопасная ставка в моих глазах - просто заменить $.validator.setDefaults({ ignore: '' });
внутрисобытие document.ready с $("form").data("validator").settings.ignore = "";
.Это изменит свойство ignore, которое фактически используется jQuery validate при каждой проверке ваших элементов для данной формы.
Опции 2b - После просмотра кода вы немного большеможет также использовать $("form").validate().settings.ignore = "";
как способ установки свойства ignore.Причина в том, что при просмотре функции validate она проверяет, был ли объект validator уже сохранен для элемента формы с помощью функции $.data()
.Если он находит объект валидатора, сохраненный с элементом формы, он просто возвращает объект валидатора вместо создания другого.