java - 默认情况下,JSF 生成不可用的 ID,这些 ID 与 Web 标准的 CSS 部分不兼容

标签 java html jsf web-standards

活跃的 JSF(或 Primefaces)用户能否解释为什么默认情况下会发生这种情况,为什么没有人对此做任何事情:

<p:commandLink id="baz" update=":foo:boop" value="Example" />

它生成的标记不能在没有 hack 的 JavaScript 或 CSS 中使用,通常应被视为无效:

<a href="javascript:void(0);" id=":foo:bar:baz">Example</a>

这里的 id=":bar:baz:foo" 属性包含冒号,至少从 CSS 的角度来看,这不是该属性的有效字符。

虽然根据规范该属性可能有效,但它无法与现实世界的 JavaScript 和 CSS 实现一起使用。

简而言之,JSF中默认的id属性生成是无法用于前端开发的。

最佳答案

:被选中是因为这是唯一可以保证最终用户不会在 JSF 组件 ID 中意外使用它的合理分隔符(它是 validated )并且可以使用它在 CSS 选择器中使用 \ 进行转义.

请注意 HTML4 spec表示冒号是 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 组件 ID 中的任何地方使用该字符您自己(它尚未经过验证!)。

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

_顺便说一下,它在 JSF 自动生成的 ID 中出现的额外缺点,如 j_id1 ,因此您还应该确保所有 NamingContainer 整个 JSF 页面中的组件都有一个固定的 ID,而不是自动生成的 ID。否则,JSF 将无法找到命名容器子项。

我只是不推荐它。从长远来看,它是令人困惑和脆弱的。再想一想,普通 JSF web 应用程序中的独特元素本身通常已经不在表单或表格中。它们通常只代表主要的布局方面。我会说,从一般的 HTML/CSS 角度来看,这是一个糟糕的设计。只需通过可重用的 CSS 类名而不是 ID 选择它们。如果你真的需要,你总是可以用纯 HTML 包装它 <div><span>其 ID 不会被 JSF 前置。

另见:

关于java - 默认情况下,JSF 生成不可用的 ID,这些 ID 与 Web 标准的 CSS 部分不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726653/

相关文章:

java - 将字符串拆分为 unicode 单词? (特别是越南语)

java - 在 java -jar 执行时指定 javax.net.ssl.trustStore 选项

html - Logo 居中的导航栏

html - Angular - 动态加载包含 Angular 标记的 html

jsf - 重构链接和图像

java - 在java中使用线程进行并行处理

html - 样式化图像容器

java - JSF 验证消息

JSF Facelet 应用程序无法在 jboss AS 7 中工作

Java私有(private)修饰符混淆