更一般地说,所有JSF组件都有一个ID.如果您不提供,则JSF将使用格式j _idXXX(XXX是递增的数字)创建自动ID .
有些组件特别实现了javax.faces.component.NamingContainer接口<h:form>.这意味着此组件的所有子项的ID都以此容器的ID为前缀,以":"分隔.因此,在示例中:
<h:form id="myForm">
<h:inputText id="myInput" .../>
</h:form>
Run Code Online (Sandbox Code Playgroud)
输入的真实 ID(即HTML输入对象的ID)将是myForm:myInput.
如前所述,HTML名称和id属性由命名容器生成,并基于应用程序命名空间生成.当控件是重复控件(如a UIData)的子节点或JSP在一个页面中呈现两次时(如在portlet环境中),这可以防止冲突.呈现给HTML的id是clientId.
可以clientId手动硬编码或构建,但这是一种非常脆弱的方法.最好使用组件的getClientId(FacesContext)方法; 这是渲染器使用的.
可以获取clientId绑定组件的bean :
/** Request scope */
public class IdBean implements Serializable {
private UIComponent mytext;
public String getClientId() {
return mytext.getClientId(FacesContext.getCurrentInstance());
}
public UIComponent getMytext() { return mytext; }
public void setMytext(UIComponent mytext) { this.mytext = mytext; }
public List<String> getRows() {
List<String> rows = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
rows.add("row" + i);
}
return rows;
}
}
Run Code Online (Sandbox Code Playgroud)
风景:
<f:view>
<h:form>
<h:dataTable value="#{idBean.rows}" var="row">
<h:column>
<h:outputLabel value="#{row}" />
<h:inputText binding="#{idBean.mytext}"
onclick="foo('#{idBean.clientId}');" />
</h:column>
</h:dataTable>
</h:form>
</f:view>
<script type="text/javascript">
function foo(name) {
alert('You clicked '+name);
}
</script>
Run Code Online (Sandbox Code Playgroud)
该mytext的控件呈现10倍,所以发射它的名称的任何代码也必须是DataTable的一个孩子.
| 归档时间: |
|
| 查看次数: |
7529 次 |
| 最近记录: |