Я попробовал следующее решение, и оно работает как шарм.
$("[data-input-type=phone]", "body")
.mask("(999) 999 99 99")
.bind("blur", function () {
// force revalidate on blur.
var frm = $(this).parents("form");
// if form has a validator
if ($.data( frm[0], 'validator' )) {
var validator = $(this).parents("form").validate();
validator.settings.onfocusout.apply(validator, [this]);
}
});
Что вызывает проблему, так это упорядочение событий.
Когда элемент маскируется, он проверяется плагином maskedinput на blur
, но тот же элемент проверяется плагином validator на событии focusout
(которое является оболочкой для размытия в браузерах, отличных от ie), которое вызывается до размытия maskedinput.
В этой ситуации элемент ввода имеет значение "(___) ___ __ __"
, когда валидатор проверяет это значение. Когда код достигает события размытия maskedinput, плагин проверяет и очищает значение, так как это недопустимый ввод.
Результат проверки может быть разным для каждого случая проверки. Например, required
правила пройдут с успехом, так как элемент имеет значение. необязательные поля number
не будут заполнены, даже если мы оставим входные данные пустыми, поскольку маска типа "999"
может быть проверена как 12_
код выше проверяет, имеет ли форма маскированного ввода прикрепленную проверку, и вызывает обработчик события focusout. Поскольку наш обработчик подключен как последний, надеюсь, он будет вызван наконец.
Предупреждение, код просто копирует поведение плагина проверки. Это, вероятно, будет работать в течение десятилетия, но может потерпеть неудачу, если плагин проверки решит сделать что-то другое, чем сейчас.
искренно