这是一个老问题,但目前已被查看 10,354 次。我想分享我在 primefaces 6.2 中解决“动态添加 CSS 样式属性”的方法
在我的布局中,我有一个标题,我需要每 10|20 秒动态更改一次图像。
<h:panelGrid id="cabecera" columns="2" cellpadding="1" columnClasses="..."
style="width:100%; background-size: cover; background-position: center; background-image: url('#{request.contextPath}/resources/images/header/Vignette/#{userSelected.headerFile}');">
<h:form id="...." >
我有一个列表,其中包含我可以使用的所有图像的名称,userSelected.headerFile随机选择一个。
三个类似的选项:
1.-起初我使用p:poll直接更新panelGrid id 'cabecera':
<p:poll interval="10" update="@([id$=cabecera])" autoStart="true"/>
当然,每次更新时背景图像都会发生变化。在某些更新和页面闪烁不成问题的情况下,这可能就足够了。
2.- 在p:poll的监听器中使用一点 JavaScript,一个 bean 方法。声明一个 js 函数来更改背景属性(或任何其他):
<script>
function headerBackground(urlBG) {
var laUrl = (urlBG);
document.getElementById('cabecera').style.backgroundImage = laUrl;
}
</script>
在我的 Bean userSelected 中,我声明了一个通过RequestContext.getCurrentInstance().execute(...)调用 javascript函数的方法。我决定只收到url并在函数中添加其余值:
public void callJSheaderBackground(String url) {
String jsFunc="headerBackground(\"".concat(url.trim()).concat("\")");
try{
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute(jsFunc);
}catch(Exception ex){
...
}
}
最后是p:poll
<p:poll interval="20" listener="#{userSelected.callJSheaderBackground('url(\''.concat(request.contextPath).concat('/resources/images/header/Vignette/').concat(userSelected.headerFile).concat('\')'))}" autoStart="true"/>
3.- 直接调用 JS 函数 My JS 函数,接收contextPath和图像文件名作为参数:
function setVignetteAsBackground(contextPath,vignetteName) {
var laUrl = "url('" + (contextPath)+'/resources/images/header/Vignette/'+(vignetteName)+"')";
document.getElementById('cabecera').style.backgroundImage = laUrl;
}
然后直接从onstart上的p:poll调用| 完成事件:
<p:poll interval="20" onstart="setVignetteAsBackground('#{request.contextPath}','#{userSelected.headerFile}')" autoStart="true"/>
希望对某人有用。