我有一个复杂的ICEFaces XHTML页面,根据用户在页面上输入数据时设置的标志,有条件地呈现某些组件。我想要做的是在出现某个字段时将其直接聚焦到某个字段,这可能不是在页面的初始渲染期间。
ICEFaces documentation建议我可以使用outputBody组件的focus属性来执行此操作。具体做法是:
如果设置初始焦点,则必须在第一次渲染调用时渲染焦点组件,否则,仅在渲染组件时设置焦点属性。
这似乎表明我可以在渲染条件组件时操纵焦点属性的值。但是,我没有看到inputText组件的任何属性允许我在组件呈现时更改值。
我误读了文档吗?我何时何地可以更改outputBody的focus属性的值,以便我的有条件渲染字段在出现时获得输入焦点?或者我使用错误的工具来解决这个问题?
答案 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>
elementId
是jsf component clientId
。