活跃的 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/