Omnifaces TagAttribute Id 不能用作 id
Omnifaces TagAttribute Id cannot be used as id
我有以下 Facelet 标签库:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:o="http://omnifaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html">
<o:tagAttribute name="id"/>
<h:panelGroup id="#{id}" layout="block" styleClass="idTest">
#{id}
</h:panelGroup>
</ui:composition>
taglib.xml 看起来像这样:
<tag>
<tag-name>idTest</tag-name>
<source>resources/myProject/tags/idTest.xhtml</source>
</tag>
而使用它的代码很简单:
<myProject:idTest/>
怎么会呈现以下HTML:
<div class="idTest">
j_ido489794984_4bf870cd
</div>
为什么我的PanelGroup
没有id
? id
是根据 o:tagAttribute
的文档生成的,因为 div
的内容已呈现。但是作为 id
它不起作用。为什么?
这确实令人困惑。
documentation字面意思是:
... it will autogenerate an unique ID in the form of j_ido[tagId]
where [tagId]
is the <o:tagAttribute>
tag's own unique ID.
但实际行为更像是这样:
... it will override any autogenerated ID into the form of j_ido[tagId]
where [tagId]
is the <o:tagAttribute>
tag's own unique ID.
换句话说,当 JSF 本身 需要 呈现 HTML 元素的 id
属性时,通常是因为某些内部逻辑进一步需要它在链的下方,例如 <f:ajax>
和 friends,并且没有像 <x:someTag id="fixedId" />
这样在标签上指定明确的 ID,那么 JSF 将默认以 j_id[autoIncrementInteger]
的形式自动生成一个。但这在标记文件上会出错,因为 autoIncrementInteger
可能会在每次回发时进一步增加一个,具体取决于所使用的 JSF impl 和视图状态配置。 <o:tagAttribute>
只是尝试以这种方式确保自动生成的 ID 在每次回发时保持相同。
当您编辑测试标记文件以添加 <f:ajax>
、
<h:panelGroup id="#{id}" layout="block" styleClass="idTest">
<f:ajax event="click" />
</h:panelGroup>
然后你会看到生成的 <div>
有一个 id
,因为这是 <f:ajax>
的技术要求。
<div id="j_ido-1512689859_13a7e7e3" class="idTest"
onclick="mojarra.ab(this,event,'click',0,0)">
</div>
或者当您将 <h:panelGroup>
换成例如<h:form>
或任何在客户端始终需要 ID 的组件,
<h:form id="#{id}" styleClass="idTest">
<ui:insert />
</h:form>
然后你也会看到它已经生成了。
<form id="j_ido-1512689859_13a7e7e3" name="j_ido-1512689859_13a7e7e3" method="post" action="/test.xhtml" class="idTest" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_ido-1512689859_13a7e7e3" value="j_ido-1512689859_13a7e7e3" />
...
</form>
换句话说,该功能运行良好,但在您的特定情况下根本没有使用它,因为 JSF 认为没有必要生成它。
我同时 updated 文档。
我有以下 Facelet 标签库:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:o="http://omnifaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html">
<o:tagAttribute name="id"/>
<h:panelGroup id="#{id}" layout="block" styleClass="idTest">
#{id}
</h:panelGroup>
</ui:composition>
taglib.xml 看起来像这样:
<tag>
<tag-name>idTest</tag-name>
<source>resources/myProject/tags/idTest.xhtml</source>
</tag>
而使用它的代码很简单:
<myProject:idTest/>
怎么会呈现以下HTML:
<div class="idTest">
j_ido489794984_4bf870cd
</div>
为什么我的PanelGroup
没有id
? id
是根据 o:tagAttribute
的文档生成的,因为 div
的内容已呈现。但是作为 id
它不起作用。为什么?
这确实令人困惑。
documentation字面意思是:
... it will autogenerate an unique ID in the form of
j_ido[tagId]
where[tagId]
is the<o:tagAttribute>
tag's own unique ID.
但实际行为更像是这样:
... it will override any autogenerated ID into the form of
j_ido[tagId]
where[tagId]
is the<o:tagAttribute>
tag's own unique ID.
换句话说,当 JSF 本身 需要 呈现 HTML 元素的 id
属性时,通常是因为某些内部逻辑进一步需要它在链的下方,例如 <f:ajax>
和 friends,并且没有像 <x:someTag id="fixedId" />
这样在标签上指定明确的 ID,那么 JSF 将默认以 j_id[autoIncrementInteger]
的形式自动生成一个。但这在标记文件上会出错,因为 autoIncrementInteger
可能会在每次回发时进一步增加一个,具体取决于所使用的 JSF impl 和视图状态配置。 <o:tagAttribute>
只是尝试以这种方式确保自动生成的 ID 在每次回发时保持相同。
当您编辑测试标记文件以添加 <f:ajax>
、
<h:panelGroup id="#{id}" layout="block" styleClass="idTest">
<f:ajax event="click" />
</h:panelGroup>
然后你会看到生成的 <div>
有一个 id
,因为这是 <f:ajax>
的技术要求。
<div id="j_ido-1512689859_13a7e7e3" class="idTest"
onclick="mojarra.ab(this,event,'click',0,0)">
</div>
或者当您将 <h:panelGroup>
换成例如<h:form>
或任何在客户端始终需要 ID 的组件,
<h:form id="#{id}" styleClass="idTest">
<ui:insert />
</h:form>
然后你也会看到它已经生成了。
<form id="j_ido-1512689859_13a7e7e3" name="j_ido-1512689859_13a7e7e3" method="post" action="/test.xhtml" class="idTest" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_ido-1512689859_13a7e7e3" value="j_ido-1512689859_13a7e7e3" />
...
</form>
换句话说,该功能运行良好,但在您的特定情况下根本没有使用它,因为 JSF 认为没有必要生成它。
我同时 updated 文档。