默认情况下,JSF生成不可用的ID,这与Web标准的CSS部分不兼容
有人是活跃的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"
属性包含了冒号,至less从CSS的angular度来看,这个属性并不是这个属性的有效字符。
虽然该属性可能根据规范有效,但却无法与现实世界的JavaScript和CSS实现一起使用。
简而言之,JSF中默认的id
属性的生成不适用于前端开发。
The :
被选中是因为这是唯一明智的分隔符,可以保证最终用户不会意外地在JSF组件ID(已被validation )中使用它,并且可以在CSSselect器中使用它来转义\
。
请注意, HTML4规范指出冒号是id
和name
属性中的有效值 。 所以你的投诉是不符合“networking标准”的。
ID和名称标记必须以字母([A-Za-z])开头,后面可以跟随任意数量的字母,数字([0-9]),连字符(“ – ”),下划线(“_”) ,冒号(“:”)和句点(“。”)。
唯一的问题就是:
CSSselect器中的特殊字符需要被转义。 JS对冒号没有问题。 document.getElementById("foo:bar")
工作得很好。 唯一可能的问题是在jQuery中,因为它使用CSSselect器语法。
如果你真的需要,那么你总是可以改变默认分隔符:
通过设置javax.faces.SEPARATOR_CHAR
上下文参数为eg -
或_
,如下所示。 你只需要保证你不要在JSF组件ID的任何地方使用这个字符(它没有被validation!)。
<context-param> <param-name>javax.faces.SEPARATOR_CHAR</param-name> <param-value>-</param-value> </context-param>
_
有另外一个缺点,就是它出现在JSF自动生成的ID(如j_id1
,因此您还应该确保所有 JSF页面中的所有 NamingContainer
组件都有一个固定ID而不是自动生成的ID。 否则,JSF在查找命名容器子项时会遇到问题。
我只会不推荐它。 这是长期困惑和脆弱。 再想一想,平均JSF webapp中的独特元素本身通常不在表格或表格内。 他们通常只是代表主要的布局方面。 我会说,这是否是在一般的HTML / CSS的angular度来看是一个糟糕的devise。 只需通过可重用的CSS类名称而不是ID来select它们。 如果您确实需要,您可以始终将其包装在纯文本的<div>
或<span>
,而JSF不会将其添加到ID前面。
也可以看看:
- 什么是HTML中的id属性的有效值?
- 有没有可能在JSF中更改元素ID分隔符?
- 如何使用jQueryselectJSF组件?
- 如何在CSSselect器中使用带有冒号“:”的JSF生成的HTML元素ID?
- 在JSF复合组件中集成JavaScript,干净的方式