活跃的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角度来看,冒号不是此属性的有效字符。
id=":bar:baz:foo"
尽管该属性根据规范可能是有效的,但它无法与实际的JavaScript和CSS实现一起使用。
简而言之,idJSF中的默认属性生成不可用于前端开发。
id
的:是被选择,因为这是对于可以被保证的是,终端用户将不会意外地在JSF组件ID使用它(这是被唯一明智的分隔符[验证和 ,它可能通过用逸出它使用它在CSS选择\。
:
\
需要注意的是,HTML4规范说,结肠是一个 有效的价值id和name属性。因此,您对它与“ Web标准”不兼容的抱怨无济于事。
name
ID 和 NAME 令牌必须以字母([A-Za-z])开头,然后可以跟任意数量的字母,数字([0-9]),连字符(“-”),下划线(“ _”) ,冒号(“:”)和句点(“。”)。
因此,唯一的问题是:CSS是CSS选择器中的特殊字符,需要转义。JS本身对冒号没有任何问题。该document.getElementById("foo:bar")工作完全正常。唯一可能的问题是在jQuery中,因为它使用CSS选择器语法。
document.getElementById("foo:bar")
如果确实需要,则始终可以:通过将javax.faces.SEPARATOR_CHAR上下文参数设置为eg -或_如下来更改默认的分隔符。你只需要保证你不使用JSF组件ID的角色的任何地方 你自己 (它没有得到验证!)。
javax.faces.SEPARATOR_CHAR
-
_
<context-param> <param-name>javax.faces.SEPARATOR_CHAR</param-name> <param-value>-</param-value> </context-param>
该_由另外的缺点,它在JSF出现自动生成的ID喜欢的方式有j_id1,因此你也应该确保 所有 NamingContainer在整个JSF页面组件都有一个固定的ID而不是自动生成一个。否则,JSF将很难找到命名容器子代的名称。
j_id1
NamingContainer
我只会不推荐它。从长远来看,这令人困惑和脆弱。再想一想,普通JSF Web应用程序中的独特元素本身通常已经不在表格或表中。它们通常仅代表主要布局方面。我要说,否则从一般的HTML / CSS角度来看这是一个糟糕的设计。只需通过可重复使用的CSS类名而不是ID来选择它们。如果确实需要,可以始终将其包装为纯HTML格式,<div>否则<span>JSF不会在其ID之前添加ID。
<div>
<span>