我正在努力通过 JSON 数组动态生成按钮。
精简代码是这样的(目的是根据数据构建一个表,还没有什么花哨的,我还不精通这个):
$.ajax({
/* type, content, etc. removed */
success: function (data, textStatus, XmlHttpRequest) {
var target = $('myContainerDiv');
var result = data.d.results;
var $table = $('<table />');
for(var i=0;i < results.length; i++) {
var $row = $('<tr />');
var $cell = $('<td />');
var $button = $('<input />').attr({ type: 'button', value: 'Edit', name: 'btn' + i });
$button.click(function () {
// **
// In a .NET environment, this would become a closure
// I suspect this is the offending bit of code
//
alert(results[i].name);
};
$cell.append($button);
$row.append($cell);
$table.append($row);
}
$target.append($table);
},
/* error etc. removed*/
});
我基本上想要一个充满按钮的列,每个按钮都会从我从$.ajax
调用中获得的数组中弹出一个字段的值。
按钮实际上出现了,但它们对单击没有反应,而且我在 F12 工具控制台中没有看到运行时错误。这可能是因为该脚本是 Microsoft Dynamics CRM 2011 解决方案配置页面的一部分,但除此之外,我确信 AJAX 调用正常(我尝试让它打印出数据,我可以看到)。
更新
在点击处理程序中引用i
确实是有问题的行:像这样更改代码使事情按我的预期工作:
var $button = $('<input />').attr({ type: 'button', value: 'Edit', name: 'btn' + results[i].name });
$button.click(function () {
// 'i' value is NOT what I thought it was !
alert(this.name.substring(3,this.name.length));
// I found out in the meanwhile that 'this' references the event source
};