Как установить фокус компонента ICEFaces после первоначального рендеринга? - PullRequest
1 голос
/ 22 июня 2011

У меня есть сложная страница ICEFaces XHTML, которая отображает определенные компоненты условно на основе флагов, установленных при вводе данных пользователем на странице. То, что я хотел бы сделать, - это сразу сфокусироваться на определенном поле, как только оно появится, чего может не быть при первоначальном отображении страницы.

Документация ICEFaces предполагает, что я могу сделать это, используя атрибут focus компонента outputBody. В частности:

Если вы устанавливаете начальный фокус, фокусируемый компонент должен отображаться при первом вызове рендеринга, если нет, тогда устанавливайте атрибут focus только тогда, когда компонент визуализируется.

Похоже, что я могу манипулировать значением атрибута focus во время визуализации моего условного компонента. Однако я не вижу никаких атрибутов компонента inputText, которые бы позволили мне изменить значение во время визуализации компонента.

Я неправильно читаю документацию? Когда и где я могу изменить значение атрибута focus объекта outputBody, чтобы мое условно отображаемое поле получало фокус ввода при его появлении? Или я использую не тот инструмент для решения этой проблемы?

Ответы [ 4 ]

1 голос
/ 11 мая 2012

Может быть, вы можете использовать это

JavascriptContext.applicationFocus(FacesContext.getCurrentInstance(), "form:fieldM");
0 голосов
/ 15 октября 2014

ICEfaces поддерживает JavaScript API, который имеет функцию настройки фокуса. Таким образом, вы можете использовать его как в следующем отрывке:

<script type="text/javascript">
  jQuery(document).ready(function () {
      ice.applyFocus(elementId);
  });
</script>

elementId - это jsf component clientId.

JavaScript-код ICEFaces Api

0 голосов
/ 24 июня 2011

Из-за того, что я использую и Seam, и ICEFaces, я не смог надежно вызвать Javascript из моего серверного Java-кода.Однако я смог добавить необходимый встроенный Javascript в мой XHTML, в компонент ui:, который отображался условно, рядом с полем ввода, на которое мне нужно было перейти.Соответствующий раздел моего XHTML выглядит следующим образом:

<ice:panelGroup id="textPanelInput" >
    <ice:form id="textInputForm"  partialSubmit="true" style="vertical-align:middle;">
        <ice:inputText id="textInput"  valueChangeListener="#{appField.valueChangeListener}"
                       size="#{appField.fieldDefLengthAsInt}" 
                       value="#{appField.value}"
                       styleClass="fieldStyle" rendered="#{appField!=null}"
                       >                    
        </ice:inputText>
        <ice:message id="jo" for="textInput" />
    </ice:form>
</ice:panelGroup>
<script type="text/javascript">document.getElementById('panelsFields:0:textInputForm:textInput').focus();</script>

Строка Javascript внизу - это строка, которую я добавил для решения своей проблемы.Весь приведенный выше код находится в блоке ui: component, который может отображаться или не отображаться в зависимости от других условий.Когда рендерится этот блок ui: component, мой Javascript идет с ним и устанавливает фокус ввода на желаемое поле ввода.

0 голосов
/ 23 июня 2011

Вы можете использовать некоторый Javascript, чтобы установить фокус на элементе.

Вот фрагмент кода Java, необходимый для этого:

      JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(),
                    "document.getElementById('myForm:myTxtBox').focus();");

myTxtBox - это идентификатор элемента формы,и myForm - это идентификатор вашей формы.

Вы можете использовать его везде, где вы изменяете значения определенных переменных, для рендеринга / скрытия полей.

...