如何在初始渲染后设置ICEFaces组件的焦点?

时间:2011-06-22 15:28:43

标签: focus icefaces

我有一个复杂的ICEFaces XHTML页面,根据用户在页面上输入数据时设置的标志,有条件地呈现某些组件。我想要做的是在出现某个字段时将其直接聚焦到某个字段,这可能不是在页面的初始渲染期间。

ICEFaces documentation建议我可以使用outputBody组件的focus属性来执行此操作。具体做法是:

  

如果设置初始焦点,则必须在第一次渲染调用时渲染焦点组件,否则,仅在渲染组件时设置焦点属性。

这似乎表明我可以在渲染条件组件时操纵焦点属性的值。但是,我没有看到inputText组件的任何属性允许我在组件呈现时更改值。

我误读了文档吗?我何时何地可以更改outputBody的focus属性的值,以便我的有条件渲染字段在出现时获得输入焦点?或者我使用错误的工具来解决这个问题?

4 个答案:

答案 0 :(得分:1)

也许你可以使用这个

JavascriptContext.applicationFocus(FacesContext.getCurrentInstance(), "form:fieldM");

答案 1 :(得分:0)

您可以使用一些Javascript来设置对元素的关注。

以下是执行此操作所需的Java代码段:

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

myTxtBox是表单元素的ID,myForm是表单的ID。

您可以在更改某些变量值的任何地方使用它来渲染/隐藏字段。

答案 2 :(得分:0)

由于我同时使用Seam和ICEFaces,我无法从服务器端Java代码中可靠地调用Javascript。但是,我能够在我的XHTML中添加必要的Javascript,在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:组件块时,我的Javascript随之而来,并将输入焦点设置为我想要的输入字段。

答案 3 :(得分:0)

ICEfaces支持具有设置焦点功能的javascript api。因此,您可以像下一段摘录一样使用它:

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

elementIdjsf component clientId

ICEFaces javascript Api