2011-07-20 24 views
1

私のテストコードでは、div要素を5ループ作成するためのコンテナとして使用している単純なdivがあります。私は5つのdiv要素すべてにクリック機能を追加しようとしますが、最後のものだけがクリック機能を与えられます。クリック機能をDOM要素に動的に追加する

<div id="testbed"></div> 

<script type="text/javascript"> 
$(document).ready(function() { 
    for (i = 0; i < 5; i++) { 
     $("#testbed").html($("#testbed").html() + "<div id='" + i + "'>Hello!</div>"); 
     $("#" + i).click(function() { 
      alert(i); 
     }); 
    } 
}); 
</script> 

は興味深いことに、代わりに4を警告するのではなく、私はそれだけであなたのclickの最初の4

+0

お元気ですか、ありがとうございます。あなたの中には既に実例が掲載されていますが、皆さんがそれぞれ異なる例を使用しているので、それぞれの回答を慎重に検討していきます。助けてくれてありがとう。 –

答えて

0

また、この効果に何かをすることができます:

$.each([1, 2, 3, 4, 5], function(index, value) { 
    $("#testbed").append("<div id='" + index + "'>Hello!</div>"); 
    $("#" + index).click(function() { 
     alert(index); 
    }); 
}); 
+0

これは私が出会った最初の実例でした。どうもありがとう。 –

2

すべてを最後のdiv要素にクリック機能を適用していない理由を知りません5.警告しますハンドラは同じi変数を共有しています。
ループの後に、i5であるので、それらはすべて5と言います。

iをパラメータとする別々の関数で各ハンドラを作成する必要があります。これにより、各ハンドラは独自のiを取得します。

例えば:

function buildElement(i) { 
    $("#testbed").html($("#testbed").html() + "<div id='" + i + "'>Hello!</div>"); 
    $("#" + i).click(function() { 
     alert(i); 
    }); 
} 


for (i = 0; i < 5; i++) { 
    buildElement(i); 
} 
+0

どのように見えるでしょうか?文字通りそのループの外に新しい関数を作成し、div関数を追加するdiv要素をループしますか? –

+0

この例では、他のdivにクリック機能は追加されません。 –

+0

HTMLを再設定すると、イベントハンドラを含むDOM要素の状態がクリアされます。代わりに 'append()'を呼び出す必要があります。 – SLaks

0

は、次はjavascriptのクロージャと呼ばれています。バインディングの瞬間に、イベントが発生するとalert(i)を実行する別の関数を返す無名関数を実行します。最初の匿名関数 "wraps"は、iの可変スコープの別のレベルを作成するので、元のiが後でインクリメントされると、無名関数内のiは変更されません。気の利いた小さなトリック。 javascript closures

<div id="testbed"></div> 

<script type="text/javascript"> 
$(document).ready(function() { 
    for (i = 0; i < 5; i++) { 
     $("#testbed").html($("#testbed").html() + "<div id='" + i + "'>Hello!</div>"); 
     $("#" + i).click(function (i) { 
      return function(evt) { 
       // inside here, you have access to the event object too 
       alert(i); 
      }; 
     }(i)); 
    } 
}); 
</script> 

詳しい情報は、すべてのdiv要素にクリックイベントを追加したい場合はところで、あなたはそうのように、代わりに.append()を使用し、すべてのループで.html() に置き換えることはできません。

<div id="testbed"></div> 

<script type="text/javascript"> 
$(document).ready(function() { 
    for (i = 0; i < 5; i++) { 
     $("#testbed").append("<div id='" + i + "'>Hello!</div>"); 
     $("#" + i).click(function (i) { 
      return function(evt) { 
       // inside here, you have access to the event object too 
       alert(i); 
      }; 
     }(i)); 
    } 
}); 
</script> 
+0

この例は機能しませんでした。最後のdiv項目にクリック機能が追加されました。 –

+0

@Jayは魅力的に機能します:http://jsfiddle.net/QvZFd/ – zatatatata

+0

私はあなたに正しい解決策を与えた唯一のレスポンダーであり、回避策ではありません。 – zatatatata

0

クリックイベントをオブジェクトに追加する必要があります。

$(function(){ 

     $('#testbed').empty();  

    for (i = 0; i < 5; i++) { 
      $('<div />').text('Hello').attr('id', i).click(function(){ 
       alert($(this).attr('id')); 
      }).appendTo('#testbed'); 
     } 

    }); 
+0

助けてくれてありがとう。それは魅力のように働いた。 –

+0

うれしい私は助けることができました! – simonlchilds

関連する問題