如何在JSF中动态添加css样式属性

时间:2013-08-02 08:50:17

标签: css jsf primefaces

我正在使用primeface作为UI组件,我必须使用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");

使用这个我可以设置和获取类名,但如何动态更改属性“background-image:”?

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

提前致谢, 飞马

2 个答案:

答案 0 :(得分:4)

使用style属性代替styleClass

答案 1 :(得分: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.-使用一些JavaScript,这是 p:poll 的侦听器中的bean方法。     声明一个js函数来更改 background属性(或其他任何属性):

 <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:投票

  <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"/> 

希望对某人有用。