如何在h:inputText中指定name属性?

时间:2013-04-09 05:20:23

标签: jsf primefaces

我需要在html输出后面呈现h:inputText

  <input id="yourName" type="text" name="name" />
  <input id="email" type="text" name="email" />

但是h:inputText呈现的name属性与组件的客户端ID相同。我想自己指定name属性,而不是将客户端ID放入其中,以便输入字段可以显示其他站点上相同字段类型的先前提交的值的有意义的自动完成建议。对于例如当我使用带有输入字段的name="email"电子邮件时,会向用户显示他之前在其他网站上提交的电子邮件ID的建议。

2 个答案:

答案 0 :(得分:15)

使用<h:inputText>无法实现此目的。它的名称由JSF根据客户端ID自动生成(客户端ID又基于组件ID及其所有命名容器父项)。

无论如何,您基本上有两种选择来实现具体的功能要求:

  1. 如果没有其他命名容器父项,请指示父表单不添加其ID:

    <h:form prependId="false">
    

    但这会导致<f:ajax>失败。

  2. 使用纯HTML元素而不是JSF组件:

    <input name="name" value="#{bean.name}" />
    <input name="email" value="#{bean.email}" />
    

    您只需要通过@ManagedProperty在请求范围的bean上自行收集它们:

    @ManagedProperty("#{param.name}")
    private String name;
    
    @ManagedProperty("#{param.email}")
    private String email;
    

    你会错过JSF内置的验证/转换工具和ajax魔法。

  3. 但是有一个完全不同的选择:使用HTML5 <input type="email">。这样,浏览器将自动提供所有先前在相同类型的输入上输入的电子邮件。 <h:inputText>本身不支持此功能。但是,您可以使用自定义渲染工具包来使其工作,如Adding custom attribute (HTML5) support to Primefaces (3.4)

    中所述
    <h:inputText type="email" ... />
    

    从JSF 2.2开始

    更新,您最终可以轻松声明passthrough attributes,而无需自定义渲染工具包。

    <... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
    ...
    <h:inputText a:type="email" ... />
    

答案 1 :(得分:-1)

您可以在不指定name属性的情况下执行所需操作。 id属性就足够了。根据示例尝试以下内容:

< h:inputText id="email" ... />

...
$("#email input").click(function (event) {
...
}

而不是

$("#email input[name='email']").click(function (event) 

希望这是你要找的东西:)