我有同样的问题这是我的解决方案(不是超级简单但非常灵活):
如果要为页面的某些部分添加加载指示器,则需要添加两个<h:panelGroup>
元素,一个用于加载指示器,一个用于加载的内容。
例如:
<h:panelGroup styleClass="contentPreview content">
<h:outputText id="previewText" styleClass="updatePreview" value="#{lazyResultBean.previewContent}" />
</h:panelGroup>
<h:panelGroup styleClass="contentPreview loading">
<p:graphicImage style="width: 15px; height: 15px;" name="/images/ajax-loader.gif" />
</h:panelGroup>
loading
重要的是为加载指示器和内容设置正确的样式类content
。两个面板还需要有一个它们共享的类,在本例中为contentPreview
Class。
要在加载指示器和内容之间切换,您只需要调用一个 JavaScript 函数。
showLoading('.contentPreview')
显示加载指示器
hideLoading('.contentPreview')
隐藏指示器并显示内容。
例如:
<p:commandButton id="previewBtn" onstart="showLoading('.contentPreview')" oncomplete="hideLoading('.contentPreview')" value="Preview" update="previewText" actionListener="#{lazyResultBean.loadPreviewContent(result.url)}">
</p:commandButton>
JavaScript 函数的代码如下所示:
function showLoading(clazz) {
console.log('showLoading' + clazz);
var loadingElements = $(clazz + '.loading');
loadingElements.each(function (index, el) {
el.style.display = 'block';
});
var contentElements = $(clazz + '.content');
contentElements.each(function (index, el) {
el.style.display = 'none';
});
}
function hideLoading(clazz) {
console.log('hideLoading' + clazz);
var loadingElements = $(clazz + '.loading');
loadingElements.each(function (index, el) {
el.style.display = 'none';
});
var contentElements = $(clazz + '.content');
contentElements.each(function (index, el) {
el.style.display = 'block';
});
}