如何使同一个JSF复合组件多次包含以拥有自己的javascript范围?
我有一个JSF复合组件,如下所示:如何使同一个JSF复合组件多次包含以拥有自己的javascript范围?,javascript,jsf,composite-component,Javascript,Jsf,Composite Component,我有一个JSF复合组件,如下所示: <cc:implementation> <div id="#{cc.clientId}"> <h:outputScript library="js" name="helper.js"/> <script type="text/javascript"> if(typeof variables === "undefined"){ va
<cc:implementation>
<div id="#{cc.clientId}">
<h:outputScript library="js" name="helper.js"/>
<script type="text/javascript">
if(typeof variables === "undefined"){
var variables = {};
}
(function(){
variables.formid = '#{cc.clientId}';
})();
</script>
</div>
如果(变量类型==“未定义”){
var变量={};
}
(功能(){
variables.formid='#{cc.clientId}';
})();
我在
helper.js
文件中使用的variables.formid
的值。当我只包含这个复合组件一次时,它就正常工作了。当我包含多个复合组件时,每个组件都会收到最后包含的复合组件的值,我如何解决这个问题?基本上有两种方法
helper.js
添加一种“register”函数,这样您就可以在那里显式注册它,而不是让它搜索组合
<h:outputScript name="js/helper.js" target="head" />
<div id="#{cc.clientId}">
...
</div>
<h:outputScript>helper.register("#{cc.clientId}", { foo: "somevalue" });</h:outputScript>
这样,helper.js
就可以在文档准备过程中按类名收集它们
// Vanilla JS:
var yourFooComposites = document.getElementsByClassName("your-foo-composite");
// Or if you happen to use jQuery:
var $yourFooComposites = $(".your-foo-composite");
选项可以提供为()
可通过以下方式获得:
// Vanilla JS:
for (var i = 0; i < yourFooComposites.length; i++) {
var yourFooComposite = yourFooComposites[i];
var clientId = yourFooComposite.id;
var dataFoo = yourFooComposite.dataset.foo;
// ...
}
// Or if you happen to use jQuery:
$yourFooComposites.each(function(index, yourFooComposite) {
var $yourFooComposite = $(yourFooComposite);
var clientId = $yourFooComposite.attr("id");
var dataFoo = $yourFooComposite.data("foo");
// ...
});
//香草JS:
对于(var i=0;i<0.length;i++){
var yourFooComposite=yourFooComposites[i];
var clientId=yourFooComposite.id;
var dataFoo=yourFooComposite.dataset.foo;
// ...
}
//或者,如果您碰巧使用jQuery:
$yourFooComposites.each(函数(索引,yourFooComposite){
var$yourFooComposite=$(yourFooComposite);
var clientId=$yourFooComposite.attr(“id”);
var dataFoo=$yourFooComposite.data(“foo”);
// ...
});
它还使您的HTML输出不受内联脚本的影响与具体问题无关在初始代码中使用“js”作为库名是不好的。请仔细阅读并注意,我在
中添加了target=“head”
属性。如果您正确地使用了JSF
组件,它将允许JSF自动将脚本重新链接到生成的HTML
元素。基本上有两种方法
helper.js
添加一种“register”函数,这样您就可以在那里显式注册它,而不是让它搜索组合
<h:outputScript name="js/helper.js" target="head" />
<div id="#{cc.clientId}">
...
</div>
<h:outputScript>helper.register("#{cc.clientId}", { foo: "somevalue" });</h:outputScript>
这样,helper.js
就可以在文档准备过程中按类名收集它们
// Vanilla JS:
var yourFooComposites = document.getElementsByClassName("your-foo-composite");
// Or if you happen to use jQuery:
var $yourFooComposites = $(".your-foo-composite");
选项可以提供为()
可通过以下方式获得:
// Vanilla JS:
for (var i = 0; i < yourFooComposites.length; i++) {
var yourFooComposite = yourFooComposites[i];
var clientId = yourFooComposite.id;
var dataFoo = yourFooComposite.dataset.foo;
// ...
}
// Or if you happen to use jQuery:
$yourFooComposites.each(function(index, yourFooComposite) {
var $yourFooComposite = $(yourFooComposite);
var clientId = $yourFooComposite.attr("id");
var dataFoo = $yourFooComposite.data("foo");
// ...
});
//香草JS:
对于(var i=0;i<0.length;i++){
var yourFooComposite=yourFooComposites[i];
var clientId=yourFooComposite.id;
var dataFoo=yourFooComposite.dataset.foo;
// ...
}
//或者,如果您碰巧使用jQuery:
$yourFooComposites.each(函数(索引,yourFooComposite){
var$yourFooComposite=$(yourFooComposite);
var clientId=$yourFooComposite.attr(“id”);
var dataFoo=$yourFooComposite.data(“foo”);
// ...
});
它还使您的HTML输出不受内联脚本的影响与具体问题无关在初始代码中使用“js”作为库名是不好的。请仔细阅读并注意,我在
中添加了target=“head”
属性。如果您正确使用JSF
组件,它将允许JSF自动将脚本重新分配到生成的HTML
元素。全局javascript范围内的变量。也许你应该为你的组件定义一个变量映射,比如variables[#{cc.clientId}].formid=#{cc.clientId}
在这种情况下,如果你需要多次包含脚本部分,variables
变量在全局javascript范围内,想想你将如何在纯html中解决这个问题。也许你应该为你的组件定义一个变量映射,比如variables[#{cc.clientId}].formid=#{cc.clientId}
在这种情况下,如果你需要多次包含脚本部分,想想你将如何在纯html中解决这个问题。