首页 文章

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

提问于
浏览
10

我需要渲染 h:inputText ,如下面的html输出:

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

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

2 回答

  • 15

    你无法使用 <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> 本身不支持此功能 . 但是,您可以使用自定义渲染工具包来使其工作,如_2596108中所述:

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

    Update 从JSF 2.2开始,您最终可以轻松声明passthrough attributes而无需自定义渲染工具包 .

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

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

    < h:inputText id="email" ... />
    
    ...
    $("#email input").click(function (event) {
    ...
    }
    

    代替

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

    希望这是你要找的:)

相关问题