Я пытаюсь выгрузить всплывающие окна в моем проекте JSF 2 с использованием составных компонентов.Доступ к составным составным элементам JSF в JavaScript
В этой базе кода используются Icefaces 3.3.0 (с их уровнем совместимости 1.8.2 по историческим причинам), Mojarra 2.2.7 и Glassfish 4.1.
У меня есть input.xhtml, который обеспечивает ввод текста и использует всплывающее окно с двумя кнопками (ok/cancel), которое, в свою очередь, основывается на основном всплывающем окне.
input.xhtml:
<composite:interface>
<!-- ... -->
<composite:editableValueHolder name="forInput" targets="theInput"/>
</composite:interface>
<composite:implementation>
<my:popup2Buttons>
<ice:inputText id="theInput" value="..."/>
<script>setInputFocus("#{cc.clientId}:theInput");</script>
</my:popup2Buttons>
</composite:implementation>
popup2buttons.xhtml:
<composite:interface>
<!-- ... -->
</composite:interface>
<composite:implementation>
<my:popup>
<composite:insertChildren/>
<ice:commandButton id="OkButton"
value="Ok"
actionListener="..."/>
<ice:commandButton id="CancelButton"
value="Cancel"
actionListener="..."/>
</my:popup>
</composite:implementation>
popup.xhtml:
<composite:interface>
<!-- ... -->
</composite:interface>
<composite:implementation>
<script>
function setInputFocus(id) {
document.getElementById(id).focus();
}
</script>
<ice:panelPopup>
<f:facet name="body">
<h:panelGroup>
<composite:insertChildren/>
</h:panelGroup>
</f:facet>
</ice:panelPopup>
</composite:implementation>
Всплывающее работает в основном, как и ожидалось, то есть, я могу ввести что-то , кнопки ok и cancel работают, а также работает валидация.
Не работает мой код JavaScript, который пытается сфокусировать ввод при всплывании.
Когда я смотрю страницу в Firebug, я вижу, что идентификатор ввода - это MyForm:j_idt63:j_idt64:j_idt67:theInput
, но код JavaScript пытается сфокусировать элемент с ID MyForm:j_idt63:theInput
.
Почему #{cc.clientId}
в input.xhtml
Неправильный идентификатор, который вводит в конце концов? Что мне нужно сделать, чтобы сделать эту работу?
Я видел BalusC's hint on adding a binding, но мне не нужна привязка, чтобы составной компонент не зависел от каких-либо бэкэндов.
Есть ли что-то еще, что мне не хватает здесь?
Метод привязки, похоже, работает только для входов, но не для, например, 'CommandButton'. Это правильно или я чего-то не хватает? Когда я добавляю атрибут 'binding =" # {okButton} "' к кнопке, он не будет отображаться. Это не было частью первоначального вопроса; Я пытаюсь иметь обработчик события onKeyPress на входе и нажимать кнопку ok, когда пользователь нажимает кнопку ввода и кнопку отмены, когда пользователь нажимает esc. – Robert
Это может произойти, если несколько компонентов кнопок имеют один и тот же «привязку». Вы должны использовать 'binding =" # {cc.okButton} "' как объяснено в ответе. – BalusC