Что вызывает полный запрос на этой странице? - PullRequest
3 голосов
/ 11 августа 2011

Рассмотрим следующую страницу JSF:

<h:body>
    <h:form id="SessionStartDialog">
        <table>
            <tr>
                <td class="label">
                    <h:outputLabel
                        value="Enter your username:" 
                        for="UsernameField"/>
                </td>
                <td class="input">
                    <h:inputText 
                        id="UsernameField"
                        value="#{login.username}"
                        validator="#{login.validateUsername}"
                        tabindex="1">
                        <f:ajax render="SelectWorkingSetListbox
                                StartSessionButton UsernameMessage" />
                    </h:inputText>
                    <h:message 
                        id="UsernameMessage"
                        for="UsernameField" />
                </td>
            </tr>
            <tr>
                <td class="label">
                    <h:outputLabel
                        value="Choose a working-set:" 
                        for="SelectWorkingSetListbox"/>
                </td>
                <td class="input">
                    <h:selectOneMenu
                        id="SelectWorkingSetListbox"
                        tabindex="2"
                        disabled="#{!login.showWorkingSets}"
                        value="#{login.selectedWorkingSetName}">
                        <f:selectItems 
                            value="#{login.workingSetNames}"/>
                        <f:ajax />
                    </h:selectOneMenu>
                </td>
            </tr>
        </table>
        <h:commandButton 
            id="StartSessionButton"
            styleClass="StartSessionButton"
            disabled="#{!login.showWorkingSets}"
            value="Start Session" 
            tabindex="3"
            action="#{login.startSession}" >
            <f:ajax execute="@form"/>
        </h:commandButton>
    </h:form>
</h:body>

Что-то там заставляет Safari сообщать об ошибке при смешивании ajax и полных запросов. Я не понимаю почему, так как все компоненты, вызывающие запросы, содержат <f:ajax> -tags. В чем здесь проблема?

Обновление

Я создал минимальный пример, который вызывает эту ошибку:

<h:body>
    <h:form>
        <f:ajax render="TextField">
            <h:inputText value="#{theBean.text}" />                
        </f:ajax>
        <h:outputText id="TextField" value="#{theBean.text}" />
    </h:form>
</h:body>

theBean - это простой bean-объект в области видимости, а text - свойство типа String. По какой-то причине это вызывает следующее сообщение в Safari 5.1:

httpError: Транспорт Http вернул код состояния 0. Это обычно результат смешивания ajax и полных запросов. Это обычно нежелательно по соображениям производительности и целостности данных.

Обновление 2 Причина этого, по-видимому, заключается в том, что нажатие enter внутри поля input всегда вызывает отправку полной формы. Я понятия не имею, как это предотвратить. Как показано в первом примере, я хочу, чтобы пользователь ввел имя пользователя, а затем включаются другие компоненты формы (только если имя пользователя известно). Как бы я это правильно реализовал?

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Я бы взял Enter на <form> и вместо этого включил бы onchange на <input> элементе, где была нажата эта клавиша.1009 *

function enterToChange(event) {
  if (event.keyCode == 13 && event.target.tagName != 'textarea') {
    event.stopPropagation(); // Don't bubble up.
    event.preventDefault();  // Prevent default behaviour (submitting the form).
    event.target.onchange(); // Trigger onchange where key was actually pressed.
  }
}

Обратите внимание, что при этом игнорируется клавиша ввода в текстовых областях, где вы, конечно, хотели бы сохранить намеченное поведение (вставка новой строки).

При необходимости можно добавить дополнительную проверкучтобы увидеть, не является ли кнопка отправки disabled, и если это так, просто отпустите событие.

1 голос
/ 20 августа 2011

Причиной проблемы является то, что при отсутствии <h:commandButton> (в первом примере оно изначально отключено, во втором - его нет), нажатие return приведет к отправке всей формы,вызывая ошибку, показанную в вопросе.

На данный момент разрешено всегда включать <h:commandButton>.Поскольку он <f:ajax> -подключен, это предотвратит полную отправку.

PS: Я разместил этот ответ, чтобы показать возможное решение для других.Я все еще хотел бы знать, есть ли лучшее решение (которое не требует наличия <h:commandButton>).

...