10

活跃的 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 实现一起使用。

简而言之,idJSF 中的默认属性生成不适用于前端开发。

4

1 回答 1

32

之所以:选择 ,是因为这是唯一可以保证最终用户不会在 JSF 组件 ID 中意外使用它的合理分隔符(已验证,并且可以通过使用\.

请注意,HTML4 规范说冒号是和属性中的有效值。因此,您对它与“网络标准”不兼容的抱怨毫无用处。idname

IDNAME标记必须以字母 ([A-Za-z]) 开头,后跟任意数量的字母、数字 ([0-9])、连字符 ("-")、下划线 ("_") , 冒号 (":") 和句点 (".")。

唯一的问题是,这:是 CSS 选择器中的一个特殊字符,需要转义。JS 本身对冒号没有任何问题。document.getElementById("foo:bar")作品非常好。唯一可能的问题是在 jQuery 中,因为它使用 CSS 选择器语法。

如果你真的需要,那么你总是可以:通过将javax.faces.SEPARATOR_CHAR上下文参数设置为 eg-_如下来更改默认分隔符。您只需要保证您自己不会在 JSF 组件 ID 中的任何地方使用该字符它尚未经过验证!)。

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

顺便说一句,它在_JSF 自动生成的 ID(否则 JSF 将在查找命名容器子项时遇到问题。j_id1 NamingContainer

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

也可以看看:

于 2012-05-23T19:44:49.583 回答