Я понимаю, что это беспокоит вас, очевидно, вы хотели бы показать только одно сообщение одновременно. Но это также беспокоит конечного пользователя, курсор больше не залипает в следующем поле, конечный пользователь вынужден исправить ошибку проверки предыдущего поля прямо сейчас и без оправданий! Возможно, конечному пользователю нужно было еще время подумать о данных, прежде чем их заполнять? Как бы вы себя чувствовали, когда столкнулись с такой формой? Возможно, вам просто не следует менять фокус? Возможно, вам следует изменять фокус на 1-е недействительное поле всякий раз, когда нажата кнопка реального отправки?
Тем не менее, это интересная проблема. Вы действительно можете подключить атрибут onevent
<f:ajax>
для перехвата состояния запроса ajax. Вы действительно можете использовать магию jQuery, чтобы отключить (на самом деле, удалить) обработчик onblur
, а затем добавить его снова, когда JSF выполнит свою работу с ajax (и вы выполнили свою работу с фокусом). Вы можете использовать jQuery.data()
для хранения и извлечения произвольной информации HTML-элемента, такой как оригинальный обработчик onblur
(что-то вроде того, что вы сделали бы с <f:attribute>
в мире JSF):
function process(data) {
switch (data.status) {
case "begin":
jQuery(":input", data.source.form).not(data.source).each(function() {
var $this = $(this);
$this.data("onblur", $this.attr("onblur"));
$this.removeAttr("onblur");
});
break;
case "success":
jQuery(":input.input-error:first").focus();
jQuery(":input", data.source.form).not(data.source).each(function() {
var $this = $(this);
$this.attr('onblur', $this.data("onblur"));
$this.removeData("onblur");
});
break;
}
}