5

我在 UI 组件中使用 primeface,我必须通过使用 css 样式来临时设置布局单元的背景,

 .layoutCustomStyle.ui-layout-unit-content
  {
     background-image: url('resources/images/backgrnd.png');
  }

layoutunit 的 id 是“layoutId”,使用的 styleclass 是“layoutCustomStyle”

在 xhtml 中,

<p:layoutUnit position="top" id= "layoutId" styleClass ="layoutCustomStyle">
</p:layoutUnit>

但我想要的是动态添加背景图像。图像将由文件浏览器选择,因此我无法为此添加单独的类并使用 bean。

UIViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
UIComponent comp= view.findComponent("layoutId");
Map<String, Object> attrMap = comp.getAttributes();
String className = (String)attrMap.get("styleClass");

使用它我可以设置和获取类名,但如何动态更改属性“背景图像:”?

希望问题很清楚。任何帮助表示赞赏。

在此先感谢,飞马

4

2 回答 2

5

使用style属性而不是styleClass.

于 2013-08-02T12:16:47.640 回答
0

这是一个老问题,但目前已被查看 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"/> 

希望对某人有用。

于 2018-07-26T07:33:09.973 回答