По умолчанию JSF генерирует непригодные идентификаторы, которые несовместимы с CSS-частью веб-стандартов.
Может ли кто-нибудь, кто является активным пользователем JSF (или Primefaces), объяснить, почему по умолчанию это происходит, почему никто ничего не делает с этим:
<p:commandLink id="baz" update=":foo:boop" value="Example" />
Который генерирует разметку, которая не может быть использована в JavaScript или CSS без хаков и обычно считается недействительной:
<a href="javascript:void(0);" id=":foo:bar:baz">Example</a>
id=":bar:baz:foo"
Атрибут здесь содержит двоеточия, которые не являются допустимыми символами для этого атрибута, по крайней мере, с точки зрения CSS.
Хотя атрибут может быть действительным в соответствии со спецификацией, он не может работать с реальными реализациями JavaScript и CSS.
Короче говоря, по умолчанию id
генерация атрибутов в JSF непригодна для разработки интерфейса.
1 ответ
:
был выбран, потому что это единственный разумный символ-разделитель, для которого можно гарантировать, что конечный пользователь не будет случайно использовать его в идентификаторах компонентов JSF (что было проверено) и что его можно использовать в селекторах CSS, экранируя его с помощью \
,
Обратите внимание, что спецификация HTML4 говорит, что двоеточие является допустимым значением в id
а также name
приписывать. Таким образом, ваша жалоба на то, что она не совместима с "веб-стандартами", никуда не денется.
Токены ID и NAME должны начинаться с буквы ([A-Za-z]) и могут сопровождаться любым количеством букв, цифр ([0-9]), дефисов ("-"), подчеркиваний ("_"), двоеточия (":") и точки (".").
Единственная проблема заключается в том, что :
это специальный символ в селекторах CSS, который необходимо экранировать. У JS нет проблем с двоеточиями. document.getElementById("foo:bar")
отлично работает Единственная возможная проблема в jQuery, потому что он использует синтаксис селектора CSS.
Если вам действительно нужно, то вы всегда можете изменить символ разделителя по умолчанию :
установив javax.faces.SEPARATOR_CHAR
контекстный параметр, например, к -
или же _
как ниже. Вам нужно только гарантировать, что вы нигде не используете этот символ в идентификаторах компонентов JSF (это не было проверено!).
<context-param>
<param-name>javax.faces.SEPARATOR_CHAR</param-name>
<param-value>-</param-value>
</context-param>
_
между прочим, имеет дополнительный недостаток, что происходит в автоматически сгенерированных идентификаторах JSF, таких как j_id1
Таким образом, вы также должны убедиться, что все NamingContainer
компоненты на ваших страницах JSF имеют фиксированный идентификатор вместо автоматически сгенерированного. В противном случае у JSF возникнут проблемы с поиском дочерних контейнеров именования.
Я бы только не рекомендовал это. Это в долгосрочной перспективе запутанно и хрупко. Если подумать еще раз, уникальные элементы в обычном веб-приложении JSF обычно уже не находятся внутри форм или таблиц. Как правило, они просто представляют основные аспекты макета. Я бы сказал, что в целом плохой дизайн в целом с точки зрения HTML/CSS. Просто выберите их по многократно используемым именам классов CSS вместо идентификаторов. Если вам действительно нужно, вы всегда можете обернуть его в простой HTML <div>
или же <span>
чей ID не будет добавлен JSF.
Смотрите также:
- Какие допустимые значения для атрибута id в HTML?
- Можно ли изменить разделитель идентификатора элемента в JSF?
- Как выбрать компоненты JSF, используя jQuery?
- Как использовать сгенерированный JSF идентификатор элемента HTML с двоеточием ":" в селекторах CSS?
- Интеграция JavaScript в составной компонент JSF - чистый путь