【发布时间】:2025-12-18 08:50:01
【问题描述】:
我正在动态创建buttons 的列表并将它们附加到span。每个按钮都与通过 ajax 下载的 JSON 数据相关联。数据显然有效,但我的 jQuery click 事件没有获得正确的索引数据。也就是说,应该与该 cell 关联的数据不是 - 我单击的任何 cell 实际上只会对应于列表中最后一个元素的数据。为了更清楚,这是我所拥有的(或可用的小提琴here):
-
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”)
我的第一个想法是这是一个范围问题 - 这意味着当我每次创建一个新按钮时,它都会更新其他每个单元格的按钮。我第一次尝试修复是在主 for 循环中设置 jQuery 数据:$(button).data("id", person.id);,然后将其返回到 click 函数中:$(button).data("id")。不用说,那没有用。
我做错了什么,我该如何解决?
【问题讨论】:
-
这是一个使用
.data()的工作示例 :) jsfiddle.net/4LM4Y -
@Bondye
.data是一种破坏关注点分离的可怕破坏方法。您正在使您的 DOM 成为您的知识来源,而不是您的 JavaScript 对象和 JSON 数据。请参阅我的回答中的“我将如何做到这一点”部分。
标签: javascript jquery html scope