Как указать атрибут имени в h: inputText?

Мне нужно отобразить h:inputText как следующий вывод html:

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

Но h:inputText делает атрибут имени таким же, как идентификатор клиента компонента. Я хочу указать атрибут name самостоятельно, вместо того, чтобы помещать в него идентификатор клиента, чтобы поле ввода отображало содержательные предложения автозаполнения из ранее представленных значений для одного и того же типа поля на других сайтах. Напр. когда я использую name="email" с полем ввода для электронной почты, пользователю показываются предложения электронной почты, которые он отправил ранее на других сайтах.

Ответ 1

Вы не можете достичь этого, используя <h:inputText>. Его имя автогенерируется JSF на основе идентификатора клиента (который, в свою очередь, основан на идентификаторе компонента и всех его родителях-именованиях).

У вас есть в основном 2 варианта для достижения конкретного функционального требования:

  • Если нет других родительских контейнеров именования, сообщите родительской форме, чтобы он не добавлял свой идентификатор:

    <h:form prependId="false">
    

    Это приведет к ошибке <f:ajax>.

  • Используйте простые элементы 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 magic.

Однако существует совершенно другая альтернатива: используйте HTML5 <input type="email">. Таким образом браузер автоматически отключит все ранее введенные электронные письма на входах того же типа. Это не поддерживается <h:inputText>. Однако вы можете использовать собственный набор рендеринга, чтобы он работал, как указано в Добавление поддержки пользовательского атрибута (HTML5) в Primefaces (3.4):

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

Обновить по состоянию на JSF 2.2 вы можете, наконец, легко объявить атрибуты passsthrough, не нуждаясь в настраиваемом наборе рендеринга.

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

Ответ 2

Вы можете делать то, что хотите, без указания атрибута name. Атрибут id достаточно. Выполните следующие действия в соответствии с примером:

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

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

вместо

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

Надеюсь, это то, что вы ищете:)