Ответ 1
Эта часть JSF генерирует в основном следующий HTML (не совсем то, но в эффектах одно и то же):
<body>
<div id="dlgRelConsultasRealizadas">...</div> <!-- Component ID -->
<script>var dlgRelConsultasRealizadas = ...;</script> <!-- Widget var -->
</body>
У Interner Explorer проблемы с этим подходом. По какой-то непонятной причине, он загрязняет глобальное пространство имен JavaScript с помощью ссылок на ссылки на все элементы HTML по их идентификатору (и имени). Итак, в основном, var dlgRelConsultasRealizadas
из сгенерированного вывода HTML после того, как рендеринг был переопределен ссылкой на элемент HTML на <div>
. Как будто браузер впоследствии выполняет следующие действия в глобальной области:
dlgRelConsultasRealizadas = document.getElementById("dlgRelConsultasRealizadas");
Это приведет к тому, что все исходные функции varget var будут полностью недоступны, потому что переменная dlgRelConsultasRealizadas
теперь ссылается на экземпляр HTMLDivElement
, который не работает 't имеют те же функции, что и исходный виджет var, например show()
и т.д.
Поэтому рекомендуется указывать widgetVar
уникальное значение, которое не используется как идентификатор или имя любого (сгенерированного) элемента HTML. Общей практикой является префикс (или суффикс) имени переменной виджета с последовательной меткой. Например. w_
.
<p:dialog id="dlgRelConsultasRealizadas" widgetVar="w_dlgRelConsultasRealizadas" .../>
Обновить: поскольку PrimeFaces 4.0, среди прочего, указанная выше причина, а также потому, что "глобальное загрязнение пространства имен" со стороны "сторонних библиотек" считается плохой практикой в мире JavaScript, переменные виджетов больше не вводятся в глобальном масштабе. Они с тех пор, как PF4 доступен только через функцию PF()
.
Другими словами,
<p:xxx ... widgetVar="foo">
теперь больше не доступен как foo
, но только как PF('foo')
. См. Также блог Hatam Alimam на тему: Вступление в widgetVar в PrimeFaces.