默认情况下,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规范指出冒号是idname属性中的有效值 。 所以你的投诉是不符合“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,干净的方式