在JSF中,将JavaScript整合到复合竞争者中的“正确”和“干净”方式是什么?我是Unobtrusive JavaScript的粉丝,并将HTML与JS分开。什么是尽可能小怪癖的好方法?到目前为止,这是我最喜欢的:
<composite:interface>
// ...
</composite:interface>
<composite:implementation>
// ...
<script> initSomething('#{cc.clientId}'); </script>
</composite:implementation>
我不喜欢的是,使用language A
生成language B
。事件处理程序和东西基本相同。我最喜欢的是通过<insert favorite DOM JavaScript library here>
附加这些处理程序。这可能吗?你是如何进行这种整合的?
答案 0 :(得分:7)
我会说你所拥有的是最好的,只要你绝对肯定HTML元素的本质是如此独特,你绝对需要每次都用ID来选择它。
如果HTML表示不是 唯一(我可以想象Facelets模板或包含文件可能包含应用程序范围的唯一HTML元素,如标题,菜单,页脚等,但复合组件哪个可以在一个视图中重复使用多次?我终生无法想象,那么你也可以考虑使用一个唯一的类名和钩子初始化。
E.g。 /resources/composites/yourComposite.xhtml
<cc:implementation>
<h:outputScript library="composites" name="yourComposite.js" target="head" />
<div id="#{cc.clientId}" class="your-composite">
...
</div>
</cc:implementation>
with /resources/composites/yourComposite.js
(假设您使用的是jQuery)
var $yourComposites = $(".your-composite");
// ...
您可以根据需要在jQuery.each()
中为每个提取自动生成的HTML元素ID:
$yourComposites.each(function(index, yourComposite) {
var id = yourComposite.id;
// ...
});