Документация jquery.validate (как и многие ответы здесь на StackOverflow) предполагает, что вы используете $ .validator.setDefaults для назначения invalidHandler, но я не мог заставить это работать в asp.net (он работает для focusInvalid однако), вероятно, из-за нас, используя MS ненавязчивую библиотеку. Вместо этого я использовал этот код в моем Jquery готовый обработчик:
$(function() {
$.validator.setDefaults({
focusInvalid: false
});
function scrollToError(error, validator) {
var elem = $(validator.errorList[0].element);
if (elem.length) {
if (elem.is(':visible'))
return elem.offset().top - 16;
elem = elem.prev($(".select2-container"));
if (elem.length) {
return elem.offset().top - 16;
}
}
return 0; // scroll to top if all else fails
}
$('form').bind('invalid-form.validate', function(error, validator) {
// fix scrolling and validation for select2
if (!validator.numberOfInvalids())
return;
$('html, body').animate({
scrollTop: scrollToError(error, validator)
}, 500);
});
...
Я установил focusInvalid
ложь, чтобы отключить и избежать конфликта со стандартным свитка и фокус поведения.
Звонок bind()
используется вместо параметра invalidHandler и является тем же самым, что используется плагином validate.
scrollToError()
выбирает первый недопустимый элемент и возвращает позицию для прокрутки к обычному видимому элементу или предыдущему элементу с классом «select2-container» (например, элемент select2) или верхней частью страницы, если все остальное не выполняется.
Стандартное поведение (показывая ошибки проверки и т. Д.) По-прежнему работает по-прежнему.
Надеюсь, это поможет кому-то, и если у вас есть лучшее решение, мне было бы очень интересно узнать об этом.
Да, плагин jQuery Validate по умолчанию игнорирует скрытые элементы. Исправление состоит в том, чтобы просто установить опцию 'ignore' на' [] ', которая отключает это поведение по умолчанию. См. Http://stackoverflow.com/a/8565769/594235 – Sparky
Правда, но скрытый элемент по-прежнему не тот, который мы хотим прокрутить до – peter3