По умолчанию 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 context, например. - или _, как показано ниже. Вам нужно только гарантировать, что вы не используете этот символ нигде в идентификаторах компонентов 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>, идентификатор которого не будет добавлен JSF.

См. также: