Ваша проблема в том, что плагин вызывает функцию errorPlacement
только один раз для каждого проверяемого элемента. Namly, когда метка ошибки для элемента создается впервые. После этого плагин просто повторно использует уже существующую метку и просто заменяет html внутри (или скрывает метку ошибки, если элемент теперь допустим). Вот почему ваш крест удаляется и отображается фактическое сообщение об ошибке.
Просто чтобы убедиться, что плагин чист.
- элемент (без метки ошибки)
- элемент проверяется в какой-то момент
- плагин создает метку ошибки и вызывает
errorPlacement
функцию
- элемент "крест" (сообщение об ошибке в заголовке)
- Элемент получает фокус, и вы что-то меняете
- плагин повторно проверяет элемент
- Видит, что метка ошибки уже была создана (и размещена)
- плагин просто вызывает
label.html(message)
вместо удаления старой метки и чтения ее
Итак, вы видите, что ваша проблема - это своего рода оптимизация, которую выполняет плагин, чтобы сохранить некоторые ненужные вставки / удаления меток ошибок. Что тоже имеет смысл.
Вы можете проверить, что я сказал, посмотрев на validation-plugin-sourcecode
jquery.validate.js v1.6 проверка в функции showLabel
строки 617-625 для соответствующих частей.
Возможное решение может заключаться в дополнительном обеспечении пользовательского обратного вызова showErrors
, который решает проблему с грубой силой.
Что-то вроде
$("#send-mail").validate({
...
showErrors: function(errorMap, errorList) {
for (var i = 0; errorList[i]; i++) {
var element = this.errorList[i].element;
//solves the problem with brute force
//remove existing error label and thus force plugin to recreate it
//recreation == call to errorplacement function
this.errorsFor(element).remove();
}
this.defaultShowErrors();
}
...
});
Может быть, есть более чистое решение для этого, но это должно сделать это и дать вам время, чтобы найти лучшее решение.