我想为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本身或同样特定的东西作为参数的函数。
答案 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对象。您可以从中获得所需的信息。