如何从JSF clientId生成唯一的JavaScript变量名?

时间:2015-06-10 14:28:08

标签: javascript jsf el composite-component

我想为JSF复合组件的每个实例定义一个JavaScript函数。

为此,在组件内部,我尝试了类似的事情:

<h:outputScript>
function myFunction_#{component.clientId}(day) {
   //do my instance specific stuff
}
</h:outputScript>

具体来说,我试图在RichFaces日历中使用此功能,如下所示:

<rich:calendar id="calendar" ... dayClassFunction="myFunction_#{component.clientId}">

但是clientId并不一定只包含在JavaScript变量名中有效的字符。

有没有办法从JSF EL表达式中的clientId(或其他东西!)计算md5哈希或类似伪唯一的东西?

我需要它特定于实例,因为返回值依赖于实例值,而dayClassFunction属性不接受将clientId本身或同样特定的东西作为参数的函数。

3 个答案:

答案 0 :(得分:2)

我之前就是这样做的:

window['#{cc.clientId}'] = {
    myFunction1 : function() { ... },
    myFunction2 : function() { ... }
};

然后只需用

来调用它
dayClassFunction="window['#{cc.clientId}'].myFunction1()"

这样,所有内容都限定在您的组件中。最终,您可以在客户端ID中添加一些前缀,以免与窗口范围内的其他变量名冲突。

无法想到客户端ID中允许的任何字符会破坏javascript。

答案 1 :(得分:1)

假设它是您可以使用:的问题的分隔符(fn:replace):

function myFunction_#{fn:replace(component.clientId, ':', '_')}

答案 2 :(得分:1)

在调用函数时,JSF会将this指定为JSF用于实现客户端的特定于实例的JS对象。您可以从中获得所需的信息。