2012-09-27 3 views
7

JSFでは、JavaScriptを統合するための「正しい」方法と「クリーン」な方法は何でしょうか?私はUnobtrusive JavaScriptのファンであり、CSSからJSとHTMLを分離しています。できるだけ小さな欠点を持つ良い方法は何でしょうか?これは私がこれまでに一番好きなものです:私は好きではない何JavaScriptをJSFコンポジットコンポーネントにまとめる、きれいな方法

<composite:interface> 
    // ... 
</composite:interface> 

<composite:implementation> 
    // ... 
    <script> initSomething('#{cc.clientId}'); </script> 
</composite:implementation>  

language Bを生成するlanguage Aを使用すること、です。基本的に同じことが、イベントハンドラやものにも当てはまります。私のお気に入りは、<insert favorite DOM JavaScript library here>経由でハンドラをつけることです。これは可能ですか?このような統合をどうやってやっていますか?

+0

私はあなたの具体的な問題/質問を理解しているかわかりません。たとえば、jQueryだけを使用できます。 PrimeFacesやRichFacesなどの人気のあるJSFコンポーネントライブラリでもjQueryを使用しています。 – BalusC

+1

はい、もちろんです。しかし、どうにかしてそのDOM要素への参照を取得する必要があります。 IDを使用することは、それが一意であることを確認する唯一の方法です(結局のところ、IDが何であるか)。今私はJavaScriptの一部を生成したくないですが、DOMノードを取得するにはどうしたらいいですか? –

答えて

7

私は、HTML要素の性質が非常にユニークであることを確信している限り、あなたが得ることができる最高のものだと言いたいと思います。毎回IDで選択する必要があります。

でない場合は、というユニークです(Faceletsテンプレートまたはインクルードファイルには、ヘッダー、メニュー、フッターなどのアプリケーション全体に固有のHTML要素が含まれている可能性がありますが、再利用できる複合コンポーネント私は想像することはできません)、それからユニークなクラス名とフックの初期化を考慮することもできます。

など。

$yourComposites.each(function(index, yourComposite) { 
    var id = yourComposite.id; 
    // ... 
}); 
/resources/composites/yourComposite.jsにあなたが jQuery.each()におけるそれらのそれぞれのために必要なエキス自動生成されたHTML要素ID場合

var $yourComposites = $(".your-composite"); 
// ... 

することができます(あなたはjQueryのを使用していると仮定)と/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> 

+0

あなたの入力をありがとう。そうです、ほとんどの部分はユニークではなく、たとえヘッダー、メニュー、フッターであっても重要ではありません。しかし、私の頭痛は、AJAXを介してコンポーネントをリロードまたは挿入するときに始まります。私は、特定のクラス名を持つすべてのコンポーネントを再初期化することはできません。簡単な選択肢は一意のIDです。または、前に初期化されたコンポーネントを覚えておくフラグを設定します。後者はいくつかのコードを必要とし、汚れていて、本当に安全ではないと感じ、オーバーヘッドを追加します。このような問題をどうやって解決しましたか? –

関連する問題