私は問題のjsfiddleを作りました
問題は、クリックしたアイテムが最後のID(10)を表示し続けることです
これは私を夢中にさせています!ヘルプ
私は問題のjsfiddleを作りました
問題は、クリックしたアイテムが最後のID(10)を表示し続けることです
これは私を夢中にさせています!ヘルプ
これは、事前定義された変数にアラートを送信しているためです。forループでは、id
変数の値を更新しています。最後の反復では、値はになり10
、各要素のクリックハンドラーでこの変数に警告しています。使用する必要がありますthis.id
:
alert(this.id);
コード内のイベントは。であることに注意してくださいundefined
。
問題はこれに減らすことができます...
var l = 10;
for(var i = 0; i < l; ++i) {
$("#item-" + i).click(function() {
alert(i);
});
}
クリック関数の内容は、ループを通過するときに評価されません。代わりに、要素をクリックすると、その関数が実行さi
れ、その時点で何でもアラートが表示されます...この場合は10になります。あなたが多くのことをすることができる時の価値の。
値をデータ項目として要素に渡します。
var l = 10;
for(var i = 0; i < l; ++i) {
$("#item-" + i).data("id", i).click(function() {
alert($(this).data("id"));
});
}
内部エンクロージャーを作成します。トリッキーに見えますが、クリックハンドラー関数を返すのはすぐに呼び出される関数だけです。
var l = 10;
for(var i = 0; i < l; ++i) {
$("#item-" + i).click((function(n) {
return function() {
alert(n);
}
})(i));
}
あなたもそれを書くことができます...
function handler(n) {
return function() {
alert(n);
}
}
var l = 10;
for(var i = 0; i < l; ++i) {
$("#item-" + i).click(handler(i));
}
または、バインド全体を新しい関数として実行することもできます...
function bindElement(n) {
$("#item-" + n).click(function() {
alert(n);
});
}
var l = 10;
for(var i = 0; i < l; ++i) {
bindElement(i);
}
注: W3Cの仕様では、IDを数字で始めてはならないことが規定されています。http://www.w3.org/TR/html401/types.html#type-name 6.2、箇条書き2. HTMLを有効にするには、その先頭に追加する必要があります文字列で。
これは、さまざまなソリューションを示すフィドルですhttp://jsfiddle.net/XXVAP/8/