Получение JSF-компонента с Javascript
Я создаю интерфейс с использованием JSF, и мне нужно, чтобы значение одного текстового поля предоставляло значение по умолчанию для второго, если второе еще не установлено. Критический код будет выглядеть примерно так:
<h:outputScript>
function suggestValue2() {
var value2 = document.getElementById('value2').value;
if (value2 == "") {
document.getElementById('value2').value = document.getElementById('value1').value;
}
}
</h:outputScript>
<h:inputText
id="value1"
onblur="suggestValue2();" />
<h:inputText
id="value2" />
Проблема в том, что на самом деле это не работает. Фактические идентификаторы этих двух входных элементов имеют префикс с некоторыми значениями, генерируемыми JSF, которые заполняют вызовы getElementById
. Какой лучший способ для меня выполнить то, что я пытаюсь сделать здесь?
Изменить: Я должен заметить, что это будет отображаться внутри составного компонента, который может появиться несколько раз на одной странице. JSF, динамически устанавливающий фактический идентификатор, представляет желаемое поведение.
Ответы
Ответ 1
Привяжите компонент к виду,
<h:inputText binding="#{input1}" ... />
чтобы вы могли просто распечатать свой идентификатор клиента в другом месте в представлении UIComponent#getClientId()
.
<h:outputScript>
var input1 = document.getElementById('#{input1.clientId}');
// ...
</h:outputScript>
Как вы уже упоминали, что вы находитесь внутри составного компонента, может быть полезно знать, что собственный идентификатор клиентского компонента уже доступен через #{cc.clientId}
. Таким образом, более рекомендуемая альтернатива:
<cc:implementation>
<h:outputScript>
var input1 = document.getElementById('#{cc.clientId}:input1');
// ...
</h:outputScript>
...
<h:inputText id="input1" ... />
...
</cc:implementation>
См. также:
Ответ 2
Jsf использует концепцию "именования контейнеров", в которой говорится, что идентификатор не обязательно должен быть уникальным в пределах предоставленного контейнера. Если контейнер имеет идентификатор. Поэтому, если вы не даете Id контейнеру, jsf добавляет непредсказуемые значения перед элементом. С идентификатором для контейнера он становится контейнером: id элементов. И это можно использовать в JavaScript надежно