По умолчанию 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.

Смотрите также:

Другие вопросы по тегам