Вы должны понимать, что jQuery работает с деревом HTML DOM на стороне клиента. jQuery не работает напрямую с компонентами JSF, как вы написали в исходном коде JSF, но jQuery работает напрямую с деревом HTML DOM, которое генерируется этими компонентами JSF. Вам необходимо открыть страницу в веб-браузере и щелкнуть правой кнопкой мыши, а затем Просмотреть источник . Вы увидите, что JSF добавляет идентификатор сгенерированных элементов ввода HTML к идентификаторам всех родительских NamingContainer
компонентов (таких как <h:form>
, <h:dataTable>
и т. Д.) С :
по умолчанию разделитель символа. Так например
<h:form id="foo">
<p:selectManyCheckbox id="bar" />
...
закончится в сгенерированном HTML как
<form id="foo" name="foo">
<input type="checkbox" id="foo:bar" name="foo:bar" />
...
Вам нужно выбрать элементы по точно вместо этого идентификатора. Однако :
- это специальный символ в идентификаторах CSS, представляющий псевдоселектор. Чтобы выбрать элемент с :
в идентификаторе с помощью селекторов CSS в jQuery, вам нужно либо экранировать его с помощью обратной косой черты, либо использовать селектор атрибута [id=...]
, либо просто использовать старый getElementById()
:
var $element1 = $("#foo\\:bar");
// or
var $element2 = $("[id='foo:bar']");
// or
var $element3 = $(document.getElementById("foo:bar"));
Если вы видите автоматически сгенерированную деталь j_idXXX
в идентификаторе, где XXX
представляет инкрементное число, тогда вы должны присвоить конкретному компоненту фиксированный идентификатор, поскольку инкрементное число является динамическим и подчинено изменения в зависимости от физического положения компонента в дереве.
В качестве альтернативы вы также можете просто использовать имя класса:
<x:someInputComponent styleClass="someClassName" />
который заканчивается в HTML как
<input type="..." class="someClassName" />
чтобы вы могли получить его как
var $elements = $(".someClassName");
Это позволяет улучшить абстракцию и возможность повторного использования. Конечно, такие элементы не уникальны . Только основные элементы макета, такие как заголовок, меню, контент и нижний колонтитул, действительно уникальны, но они, в свою очередь, обычно не находятся в NamingContainer
.
В качестве еще одной альтернативы, вы можете просто передать сам элемент HTML DOM в функцию:
<x:someComponent onclick="someFunction(this)" />
function someFunction(element) {
var $element = $(element);
// ...
}
Смотри также: