有人知道吗?是否可以指定表单输入字段的名称?该怎么做呢?
4 回答
如前所述,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;
}
}
风景:
<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>
mytext控件呈现 10 次,因此任何发出其名称的代码也必须是 dataTable 的子级。
更一般地说,所有 JSF 组件都有一个 ID。如果您不提供,JSF 将创建一个自动 ID,使用格式 j _
idXXX(XXX是一个递增的数字)。
一些组件实现了 javax.faces.component.NamingContainer 接口,特别是<h:form>
. 这意味着该组件的所有子组件的 ID 都会以该容器的 ID 为前缀,并以“:”分隔。因此,在示例中:
<h:form id="myForm">
<h:inputText id="myInput" .../>
</h:form>
输入的真实ID(即 HTML 输入对象的 ID)将是myForm:myInput。
它生成为 formId:fieldId
因此,如果您有以下情况:
<h:form id="searchForm">
<h:inputText id="searchField" ... />
</h:form>
搜索字段的名称(和 HTML ID)将是:
搜索表单:搜索字段
对于包含视图、表单和某些组件的大多数页面,clientID 将是包含 form-id 和 component-id 的冒号分隔的字符串。例子:
输入文本客户端 ID 将是“myForm:myInputText”。如果您嵌套在子视图中,那么这将是列表中的第一件事,例如:
现在输入文本客户端 ID 将是“mySubview:myForm:myInputText”。