Можно ли изменить разделитель идентификатора элемента в JSF?
Например, следующий фрагмент:
<h:form id="levelone">
<h:inputText id="leveltwo" value="Test" />
</h:form>
генерирует следующую разметку:
<form id="levelone" name="levelone" method="post" action="/test/testPage.html"
enctype="application/x-www-form-urlencoded">
<input id="levelone:leveltwo" type="text" name="levelone:leveltwo"
value="Test" />
</form>
Можно ли изменить автоматически созданные идентификаторы для использования другого разделителя, чем двоеточие?
Например, я хотел бы изменить
levelone:leveltwo
to
levelone-leveltwo
Фон
Мы используем Mojo фреймворк JavaScript-приложения в нашем webapp, и ему, похоже, не нравятся двоеточия в id.
Ответы
Ответ 1
Это невозможно в JSF 1.x, но с JSF 2.x вы можете определить его в web.xml
как init-param
из javax.faces.SEPARATOR_CHAR
.
Тем не менее, я думаю, вы просто хотели изменить его, потому что хотите, чтобы ваш CSS работал, не так ли? Двоеточие :
является особым символом в CSS-идентификаторах, он представляет псевдоселектор. Если эта причина верна для вас, тогда было бы хорошо знать, что вы можете избежать специальных символов в CSS обычным способом с помощью \
.
Таким образом, например,
#levelone\:leveltwo {
color: blue;
}
должен работать для обычных браузеров (для IE6/7 вам нужно #levelone\3A leveltwo
).
То же самое происходит, когда вы намереваетесь использовать его с jQuery или любой другой инфраструктурой JavaScript, которая выбирает элементы с помощью Селектора CSS:
var leveltwo = $('#levelone\\:leveltwo');
В качестве альтернативы вы также можете просто указать styleClass
, который, в свою очередь, может коррелировать с классом CSS. Таким образом, например,
<h:inputText styleClass="myinput" />
который генерирует
<input type="text" class="myinput" />
можно создать с помощью
.myinput {
color: blue;
}
См. также
Ответ 2
В более старых версиях нет, это невозможно. Это жестко закодированная константа. В 2.0 вы можете изменить его. См. этот пост в блоге.
Ответ 3
Tomahawk имеет расширенные компоненты, такие как <t:inputText>
, которые имеют атрибут forceId
. Там вам нужно установить его как <t:inputText forceId="levelone-leveltwo" />
- то есть вы не сможете использовать имя сгенерированного автоматического контейнера.
Я бы посоветовал ничего подобного - я не вижу веской причины, почему :
следует изменить на -