のリストを動的に作成し、buttons
それらをに追加していspan
ます。各ボタンは、ajax 経由でダウンロードされた JSON データに関連付けられています。データは明らかに機能していますが、jQuery
click
イベントが正しいインデックス データを取得していません。つまり、そのセルに関連付けられるべきデータはそうではなく、クリックしたセルは実際にはリストの最後の要素のデータに対応するだけです。より明確にするために、ここに私が持っているものがあります(またはここで利用可能なフィドル):
JSON データ
var data = [{"id":0, "name":"Phil"}, {"id":1, "name":"Ed"}, {"id":2, "name":"Fred"}];
HTML
<span id="output"></span><br>
CSS
.listButton { color: #E3A869; font: 12pt sans-serif; display: block; width: 100%; background: white; border: 1px solid #FF7F00; text-align: left; cursor: pointer; }
コード
for (var i = 0; i < data.length; i++) { var person = data[i]; var button = document.createElement('button'); button.type = 'button'; $(button).addClass('listButton'); var text = "<b>ID:</b> " + person.id + "<br>"; text = text + "<b>Name:</b> " + person.name; $(button).html(text); $(button).click(function() { alert("selected person: " + person.id);//always 2, no matter who is clicked. }); document.getElementById("output").appendChild(button); }
結果
(任意のセルをクリックすると、「選択された人物: 2」というアラートが表示されます)
私の最初の考えは、これはスコープの問題であるということです。つまり、毎回新しいボタンを作成すると、他の各セルのボタンが更新されます。修正のための私の最初の試みは、jQuery データをメインの for loop: に設定し$(button).data("id", person.id);
、それを click 関数内に戻すこと$(button).data("id")
でした。言うまでもなく、それはうまくいきませんでした。
私は何を間違っていますか、どうすれば修正できますか?