【问题标题】:Using the component ID as widgetVar name使用组件 ID 作为 widgetVar 名称
【发布时间】:2013-09-30 13:41:34
【问题描述】:

我有一个关于组件 ID 和对话框(或其他组件)小部件变量名称的简单问题。

使用组件ID作为同一个组件的widget变量名有问题吗?

例如

<p:dialog id="dlgRelConsultasRealizadas" widgetVar="dlgRelConsultasRealizadas" .../> 

【问题讨论】:

  • 我在问这样做有没有问题?我在某个论坛(我认为是 primefaces 论坛)上看到这样做是不正确的,我想知道你对此的看法。
  • 感谢您的关注,我在这里找到并解释了link。版主可以关闭此帖子。
  • 我想您可以将其发布为您的答案,以便其他人受益

标签: jsf primefaces widget variable-names


【解决方案1】:

这段 JSF 基本上生成以下 HTML(不完全是,但效果相同):

<body>
    <div id="dlgRelConsultasRealizadas">...</div> <!-- Component ID -->
    <script>var dlgRelConsultasRealizadas = ...;</script> <!-- Widget var -->
</body>

Inner Explorer 使用这种方法存在问题。 For some unclear reason,它通过 ID(和名称)对所有 HTML 元素的变量引用污染了全局 JavaScript 命名空间。因此,基本上,生成的 HTML 输出中的 var dlgRelConsultasRealizadas 是在呈现被 &lt;div&gt; 上的 HTML 元素引用覆盖之后。就好像浏览器随后在全局范围内执行以下操作:

dlgRelConsultasRealizadas = document.getElementById("dlgRelConsultasRealizadas");

这将导致所有原始小部件 var 函数完全不可用,因为变量 dlgRelConsultasRealizadas 现在引用了一个 HTMLDivElement 实例,该实例与 show() 等原始小部件 var 的功能不同。

因此,建议为widgetVar 提供一个唯一值,该值不用作任何(生成的)HTML 元素的 ID 或名称。一种常见的做法是使用一致的标签为小部件变量名称添加前缀(或后缀)。例如。 w_

<p:dialog id="dlgRelConsultasRealizadas" widgetVar="w_dlgRelConsultasRealizadas" .../> 

更新:从 PrimeFaces 4.0 开始,由于上述原因以及“第三方库”的“全局命名空间污染”在 JavaScript 世界中被认为是不好的做法,不再注入小部件变量在全球范围内。它们是因为 PF4 只能通过 PF() 函数获得。

换句话说,

<p:xxx ... widgetVar="foo">

现在不再以foo 的形式提供,而仅以PF('foo') 的形式提供。另请参阅 Hatam Alimam 关于该主题的博客:Intro to PrimeFaces widgetVar

【讨论】:

  • 很好的解释,它比我的 serachs 更好。谢谢^^
  • Chrome 也这样做了。只要 id 在命名容器中,一切都会好起来的,所以它是一种被遗忘的地雷 bug(一旦你忘记放置它就会爆炸)
  • 不客气。默认情况下(使用正确的文档类型、不错的 JS 代码等),Chrome 并不像 IE 那样愚蠢,如果之前已经定义,它会完全覆盖原始变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
相关资源
最近更新 更多