コードには複数の問題があります。
まず、ネストされたタグを使用しないでください。<script>
終了</script>
タグが JavaScript ブロック内の文字列内にある場合でも、それを分割してそのまま表示されないようにする必要があります。先輩は言うまでもなく…
同様に、jQuery セレクターを作成するときに見落としやすいため、ID にドットを使用することは避ける必要があります。「クラスも適用されているIDを持つ要素を選択する」#id.something
ことを意味します。それなしでは生きられない場合は、セレクターを のように記述するときにエスケープできます。これにより、「id を持つ要素が選択されます」。id
something
#id\\.something
id.something
テンプレート内に JavaScript を入れるのも悪い考えです。達成しようとしていることを再考する必要があります。ほとんどの場合、それを回避する方法があります。
将来のみ作成する要素とイベントをバインドできます.delegate()
。.live()
スクリプトで ID をハードコーディングする代わりに、さまざまなセレクターを使用できます。たとえば、既存のマークアップに干渉しないように、上記のバインディングで使用する一意のクラスを適用できます。イベント ハンドラー内で ID が必要な場合は、this.id
またはを使用して簡単に抽出できます$(this).attr('id')
。
スクリプトでカスタマイズしたい場合は'some value'
、要素にカスタム属性を追加できます。たとえば<input id="static_something" data-custom="some value" />
、 を使用して関数で抽出します$(this).data('custom')
。
上記のすべてを考慮して、コードを次のように書き直します。
<script id="tmplID" type="text/x-jquery-tmpl">
<input id="static_${val}" class="templateinput" type="text" data-custom="value1" />
<input id="static2_${val}" class="templateinput" type="text" data-custom="value2" />
</script>
<script type="text/javascript">
// jQuery ready function
$(function(){
$('.templateinput').live('change', function(){
var element_id = this.id;
var element_data = $(this).data('custom');
alert('The value of input #' + element_id + ' is: ' + element_data);
});
});
</script>
すべてのテンプレート アイテムを含む既知のコンテナーがある場合は、.delegate()
明確にするために代わりに使用して、グローバル バインディングを回避します。