JSF 2, поле ввода ajax ведет себя по-разному в Firefox 10 и ie9 - PullRequest
1 голос
/ 14 марта 2012

Когда курсор находится на входе «test» и пользователь нажимает клавишу ввода в упрощенной форме, например

<h:form>
 <h:inputText id="test" value="#{myModel.someValue}" >
  <f:ajax event="blur" execute="@this" listener="#{myBean.calculateStuff}" render="myText"/>
</h:inputText>

<h:outputText id="myText" value="#{myModel.myText}"  />

<h:commandButton value="send" action="#{myBean.calculatedNextPage} ">

</h:form>

firefox вызывает 1 отправку, то есть вызывает передачу и частичный запрос.

Это поведение нормально? Со стороны приложения это неприятно, потому что на стороне клиент / сервер есть предотвращение / обнаружение множественного запроса.

Мы не знаем заранее результата страницы, если проверка / преобразование какого-либо поля завершилась неудачно, и мы не можем получить обновленный «myText», отображаемый в обоих браузерах. Проверка клавиш ввода для предотвращения отправки нежелательна, а "размытие" хорошо в обычных случаях. Любые предложения, как заставить оба браузера работать одинаково?

1 Ответ

0 голосов
/ 14 марта 2012

Такое поведение действительно нежелательно. Но MSIE как целого браузера по-своему тоже нет. Это то, с чем вам приходится иметь дело как веб-разработчику. Firefox / Chrome / Safari / и т. Д. Правильно пропускает событие размытия при наступлении события отправки.

Если ваша единственная цель - преобразовать / проверить someValue, то вы должны делать это внутри обычного преобразователя и / или валидатора, а не внутри метода слушателя ajax.

<h:inputText id="test" value="#{myModel.someValue}">
    <f:converter converterId="someValueConverter" />
    <f:validator validatorId="someValueValidator" />
    <f:ajax event="blur" execute="@this" listener="#{myBean.calculateStuff}" render="myText"/>
</h:inputText>

Таким образом, вы можете просто безопасно игнорировать «ненужные» запросы ajax.

Но если у вас действительно сильная голова, в вашем конкретном примере вы можете всегда добавлять обработчик onsubmit, чтобы пропустить onblur.

<h:form id="form" onsubmit="document.getElementById('form:test').onblur=null">
...