Вопрос по jsf, html, java – По умолчанию JSF генерирует непригодные идентификаторы, которые несовместимы с частью CSS веб-стандартов

10

Может ли кто-нибудь, кто является активным пользователем 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   ответ
31

: был выбран потому, что это единственный разумный символ-разделитель, для которого можно гарантировать, что конечный пользователь не будет случайно использовать его в идентификаторах компонентов JSF (который былподтверждено) and что его можно использовать в селекторах CSS, экранируя его\.

Обратите внимание, чтоСпецификация HTML4 говорит, что толстая кишкаvalid значение вid а такжеname приписывать. Таким образом, ваша жалоба на то, что она не совместима с "веб-стандартами" не идет никуда

ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").

Единственная проблема заключается в том, что: это специальный символ в селекторах CSS, который необходимо экранировать. У JS нет проблем с двоеточиями.document.getElementById("foo:bar") отлично работает Единственная возможная проблема - в jQuery, потому что он использует синтаксис селектора CSS.

Если вам действительно нужно, то вы всегда можете изменить символ разделителя по умолчанию: установивjavax.faces.SEPARATOR_CHAR контекстный параметр, например,- или же_ как ниже. Вам нужно только гарантировать, что вы не будете использовать этот символ где-либо в идентификаторах компонентов JSF.yourself (он не был подтвержден!).

<context-param>
    <param-name>javax.faces.SEPARATOR_CHAR</param-name>
    <param-value>-</param-value>
</context-param>

_ между прочим, имеет дополнительный недостаток, что происходит в автоматически сгенерированных идентификаторах JSF, таких какj_id1Таким образом, вы также должны убедиться, чтоall NamingContainer компоненты на ваших страницах JSF имеют фиксированный идентификатор вместо автоматически сгенерированного. В противном случае у JSF возникнут проблемы с поиском именованных контейнеров-потомков.

Я бы только не рекомендовал это. Это в долгосрочной перспективе запутанно и хрупко. Если подумать еще раз, уникальные элементы в обычном веб-приложении JSF обычно уже не находятся внутри форм или таблиц. Как правило, они просто представляют основные аспекты макета. Я бы сказал, в противном случае это плохой дизайн в целом с точки зрения HTML / CSS. Просто выберите их по многократно используемым именам классов CSS вместо идентификаторов. Если вам действительно нужно, вы всегда можете обернуть его в простой HTML<div> или же<span> чей ID не будет добавлен JSF.

See also:

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededw3.org/TR/CSS21/syndata.html#value-def-identifierError: User Rate Limit Exceeded Andrew Kolesnikov
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededw3.org/TR/html401/types.html#type-nameError: User Rate Limit Exceeded Andrew Kolesnikov

Похожие вопросы