Обновление: эта проблема была проверена как ошибка в проекте Liferay Faces и была исправлена как часть Bridge Ext 5.0.3: FACES-3328 .
Объяснение
Эта проблема связана с несовместимостью между PrimeFaces (который изначально был разработан для веб-приложений) и Liferay 7.0 / SennaJS / Portlets.PrimeFaces предполагает, что он используется в среде веб-приложений, где он контролирует всю разметку на странице, поэтому многие из компонентов, использующих JavaScript для облегчения рендеринга, присоединяют свою разметку к тегу <body>
.
Вот упрощенная версия того, что делает PrimeFaces:
<body>
<script>
var dynDiv = document.createElement("div");
var text = document
.createTextNode("I was created dynamically via JavaScript!");
dynDiv.appendChild(text);
document.body.appendChild(dynDiv);
</script>
</body>
Однако в среде портлетов портлет имеет контроль только над разметкой портлета, которая является <div>
внутри тега <body>
.Но поскольку PrimeFaces предполагает среду веб-приложения, он все еще добавляет разметку к <body>
:
<body>
<div id="myPrimeFacesPortlet">
<script>
var dynDiv = document.createElement("div");
var text = document
.createTextNode("I was created dynamically via JavaScript!");
dynDiv.appendChild(text);
document.body.appendChild(dynDiv);
</script>
</div>
</body>
До Liferay 7.0, однако это не было проблемой, поскольку каждая навигация вызывала бы полную загрузку страницы и все динамическиеэлементы, созданные JavaScript в PrimeFaces, будут уничтожены.Теперь с Liferay 7.0 движок одностраничных приложений SennaJS используется для того, чтобы гарантировать, что только необходимые части страницы загружаются и отображаются при навигации .Теперь, когда вы покидаете портлет PrimeFaces через SennaJS, все CSS PrimeFaces удаляются вместе с портлетом <div>
.Динамические элементы не удаляются, а CSS PrimeFaces выгружается, поэтому он больше не может их скрывать.
Решения
Существует несколько возможных решений этой проблемы (я заказал их от лучших дохудшее):
Если компонент имеет атрибут appendTo
, убедитесь, что разметка добавлена к элементу внутри разметки портлета: appendTo="@this"
, appendTo="@id(#{portletNamespace})"
(для самого внешнего <div>
портлета) или appendTo="@form"
также должны работать (хотя appendTo="@root"
не работает) (см. Руководство пользователя PF (стр. 558) для получения дополнительной информации о "Карте выражений поиска" ).
Навсегда скрыть динамические элементы с помощью CSS.Чтобы убедиться, что CSS не удаляется при навигации SennaJS, установите data-senna-track="permanent"
:
<h:head>
<!--You'll need to look at the CSS for each element (not just tooltip)
to figure out what CSS classes should be hidden. -->
<style id="hidePrimeFacesLeftoverMarkupWorkaroundCSS"
data-senna-track="permanent">
.ui-tooltip {
display: none;
}
</style>
</h:head>
Отключите SennaJS для вашего портлета или всего портала.
Подробнее: