我有一个关于组件ID和对话框(或其他组件)小部件变量名称的简单问题。
是否存在使用组件ID作为同一组件的窗口小部件变量名称的问题?
E.g。
<p:dialog id="dlgRelConsultasRealizadas" widgetVar="dlgRelConsultasRealizadas" .../>
答案 0 :(得分:10)
这段JSF基本上生成以下HTML(不完全是这样,但效果相同):
<body>
<div id="dlgRelConsultasRealizadas">...</div> <!-- Component ID -->
<script>var dlgRelConsultasRealizadas = ...;</script> <!-- Widget var -->
</body>
Interner Explorer在使用此方法时遇到问题。 For some unclear reason,它通过ID(和名称)对所有HTML元素的变量引用来污染全局JavaScript命名空间。因此,基本上,生成的HTML输出中的var dlgRelConsultasRealizadas
是在<div>
上的HTML元素引用覆盖渲染之后。就像浏览器之后在全局范围内执行以下操作一样:
dlgRelConsultasRealizadas = document.getElementById("dlgRelConsultasRealizadas");
这将导致所有原始窗口小部件var函数完全不可用,因为变量dlgRelConsultasRealizadas
现在引用HTMLDivElement
实例,该实例与原始窗口小部件var具有相同的功能,如{{1等等。
因此,建议为show()
提供一个唯一值,该值不用作任何(生成的)HTML元素的ID或名称。通常的做法是使用一致的标签为小部件变量名称添加前缀(或后缀)。例如。 widgetVar
。
w_
更新:自PrimeFaces 4.0以来,由于上述原因以及“第三方库”的“全局命名空间污染”被认为是JavaScript世界中的不良做法,因此不再注入窗口小部件变量在全球范围内。因为PF4只能通过<p:dialog id="dlgRelConsultasRealizadas" widgetVar="w_dlgRelConsultasRealizadas" .../>
功能使用。
换句话说,
PF()
现在不再可用<p:xxx ... widgetVar="foo">
,而只能作为foo
。另见Hatam Alimam关于此主题的博客:Intro to PrimeFaces widgetVar。