2013-07-09 14 views
13

ハンドルバーテンプレートでUIを動的にするために、単純なjQuery onClickイベントを設定したいと考えています。私は、特定のクリックの後にclassClass()を追加することを考えていました。ハンドルバーのjQuery onClickイベントの処理

は(ハンドルバーによって生成された)HTML

{{#if hasButton}} 
     <div id="container">  
      <button type="submit" class="myButton">Click me!</button> 
     </div> 
    {{/if}} 

すなわちを考慮してください。ボタン内のクリックした後、そのコンテナはCSSを使って対話を作成するロードクラスを受け取ることになります。

$(".myButton").on("click", function(event){ 
     $(this).parent().addClass("loading"); 
}); 

このコードは、私のハンドル・テンプレートに行くべきですか私はそれのために特定のヘルパーにそれを書き換える必要がありますか?私はそれを勉強することができるように提供することができますし、同様の何かを開発する例がありますか?

ありがとうございます!

+0

あなたは 'html'、' css'と 'js'を分けておくべきです。テンプレートから何かを作成する場合は、テンプレート内で実行する必要があるアクションを知っておく必要があります。 (この情報をサーバーからテンプレートと共に送信するため)、またはコード内で既に知っているためです。したがって、テンプレートを追加した後にイベントの 'callbacks'を登録するか、イベントのために[代理人](http://api.jquery.com/on/#direct-and-delegated-events)を使用します(次のようなものです: –

答えて

13

ノードをDOM HTMLに挿入した後に、Jqueryリスナーをリフレッシュする必要があります。このことができます

$(document).on('click','li',function(){ 
    alert('success'); 
}); 

希望:

var source = "<li><a href="{{uri}}">{{label}}</a></li>"; 
var template = Handlebars.compile(source); 
var context = {"uri":"http://example.com", "label":"my label"}; 
$("ul").append(template(context)); 

// add your JQuery event listeners 
$("li").click(function(){ alert("success"); }); 
0

あなたの問題は正確にはわかりません。 JavaScriptを* .jsファイルに保存した場合、perhapsの場合はprev()の代わりにparent()を使用してください。

+0

問題は、jQueryを追加するだけで機能しないため、イベントがトリガーされないということです(このコードは実際に実行されます)。 (btw私はより良いコードの可読性のために、前の()から親()に変更されました) – Hal

38

は、ドキュメントレベルでそれらを定義している場合は、すべての動的なDOMの更新時にイベントハンドラを再接続する必要はありません! :-)

+0

これは現代のWebアプリケーションで行われている方法です – ProblemsOfSumit

+2

Word。ハンドルバーテンプレートをレンダリングしたdivのように、最も近いレンダリング可能なノードに 'document'を置き換えることによって、できる限り狭くする必要があります。 –