我需要将h:inputText
呈现为以下html输出:
<input id="yourName" type="text" name="name" />
<input id="email" type="text" name="email" />
但是h:inputText
呈现的名称属性与组件的客户端id相同。我想自己指定name
属性,而不是将客户端id放在其中,这样输入字段就可以显示来自其他网站上相同字段类型的先前提交值的有意义的自动完成建议。例如,当我使用带有电子邮件输入字段的name="email"
时,会向用户显示他之前在其他网站上提交的电子邮件ID的建议。
使用<h:inputText>
无法实现。它的名称由JSF根据客户端ID自动生成(客户端ID又基于组件ID及其所有命名容器父级(。
您基本上有两个选项来实现具体的功能需求:
-
如果没有其他命名容器父窗体,请指示父窗体不要在其ID:前加上前缀
<h:form prependId="false">
然而,这将导致
<f:ajax>
失败。 -
使用纯HTML元素而不是JSF组件:
<input name="name" value="#{bean.name}" /> <input name="email" value="#{bean.email}" />
您只需要在请求范围的bean上通过
@ManagedProperty
自己收集它们:@ManagedProperty("#{param.name}") private String name; @ManagedProperty("#{param.email}") private String email;
您将错过JSF内置的验证/转换功能和ajax魔术。
然而,有一个完全不同的选择:使用HTML5<input type="email">
。这样,浏览器将在相同类型的输入上自动提示所有以前输入的电子邮件。<h:inputText>
本机不支持此功能。然而,您可以使用自定义渲染工具包使其发挥作用,如向Primefaces添加自定义属性(HTML5(支持(3.4(:中所述
<h:inputText type="email" ... />
Update从JSF 2.2开始,您终于可以轻松地声明passthrough属性,而无需自定义渲染工具包。
<... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:inputText a:type="email" ... />
您可以在不指定name属性的情况下执行所需操作。id属性就足够了。根据示例尝试以下操作:
< h:inputText id="email" ... />
...
$("#email input").click(function (event) {
...
}
而不是
$("#email input[name='email']").click(function (event)
希望这就是你想要的:(