我尝试使用jQuery选择器选择JSF组件。复合组件 .xhtml 和 .js 相对代码是分开的,所以我通过了变量cc.cliendId
如下:
var variables = {};
variables.formid = "#{cc.clientId}";
在 *。js 文件中我尝试使用它如下:$('[id="'+variables.formid+'"]')
它工作并返回一个完整的div,但以下代码不起作用,它返回一个空对象[]
:
function escapeColons(selector) {
return selector.replace(/(!|"|#|\$|%|\'|\(|\)|\*|\+|\,|\.|\/|\:|\;|\?|@)/g, function($1, $2) {
return "\\\\" + $2;
});
}
$("#" + escapeColons(variables.formid))
逃避冒号的函数取自这个答案:https://stackoverflow.com/a/4792023/947111
如果我写$("#" + "form\\:range_chooser")
, range_chooser 是复合组件的 id ,则可以正常工作。
答案 0 :(得分:1)
这并不能解决您的具体问题,但我总是发现将分隔符更改为非冲突的内容比不断转义ID更容易。您可以通过向Web.xml添加上下文参数来完成此操作。即:
<context-param>
<param-name>javax.faces.SEPARATOR_CHAR</param-name>
<param-value>-</param-value>
</context-param>
我应该补充一点,如果你的冒号到处都是硬编码,你必须回去改变所有这些。因此,根据您的设置,它可能比它的价值更麻烦。
修改强>
如果你需要保留分隔符char,你应该能够简化那个javascript:
function escapeColons(selector) {
return selector.replace(/(!|"|#|\$|%|\'|\(|\)|\*|\+|\,|\.|\/|\:|\;|\?|@)/g,"\\$1");
}
$("#" + escapeColons(variables.formid))
无论如何都适合我。