这是一个老问题,但目前已被查看 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函数
我的 JS 函数,接收 contextPath 和 图像文件名 作为参数:
function setVignetteAsBackground(contextPath,vignetteName) {
var laUrl = "url('" + (contextPath)+'/resources/images/header/Vignette/'+(vignetteName)+"')";
document.getElementById('cabecera').style.backgroundImage = laUrl;
}
然后在 onstart|oncomplete 事件上直接从 p:poll 调用:
<p:poll interval="20" onstart="setVignetteAsBackground('#{request.contextPath}','#{userSelected.headerFile}')" autoStart="true"/>
希望对某人有用。