我从一个对象制作几个按钮并将它们附加到正文中唯一的div:#main,除了实际的点击功能外,一切正常:我似乎无法使按钮警告不同属性。
这是我的目标:
var BrushDesc = function (n, i, t) {
this.presetName = n;
this.elemId = i;
this.preset = t;
};
var brush = {};
brush.circ = new BrushDesc("circle", "circle", "basic circle");
brush.rect = new BrushDesc("rectangle", "rect", "19-2");
brush.softy = new BrushDesc("round soft", "softy", "softy");
brush.rake = new BrushDesc("|||", "rake", "21-3");
这是我第一次尝试添加按钮,但这始终会警告对象的最后.preset
属性:
for (var i in brush) {
$('<button id="'+brush[i].elemId+'">'+brush[i].presetName+'</button>')
.appendTo("#main")
.click(function() {alert(brush[i].preset)});
}
所以我认为&#39;好吧:(&#39;。然后我用不同的方式制作它似乎有效,但同时这看起来非常错误(主要是因为这取决于.elemId
和{ {1}}具有相同的名称:
brush.property
任何人都可以做对吗?
编辑:感谢您指出Closures线程(尚未使用它们)Felix,但我不确定我是否理解如何将其应用于我的对象
for (var i in brush) {
$('<button id="'+brush[i].elemId+'" class="main">'+brush[i].presetName+'</button>')
.appendTo("#main")
}
$(".main").click(function() {
var buttonId = $(this).attr("id");
for (var i in brush) {
if (brush[i].elemId == buttonId) alert(brush[i].preset)
}
});
edit2 实际上我的一位朋友建议使用Immediately-Invoked Function Expression而不是关闭,它运作得很好
var tps = [];
function createTps(i) {return function() {alert(br[i].preset)}} //doh
for (i = 0; i<5; i++) {tps[i] = createTps(i)} //but I should have keys here, not numbers?
var j = 0;
for (var i in br) {
$('<button id="' + br[i].elemId + '" class="main">' + br[i].presetName + '</button>')
.appendTo("#main")
.click(function() {tps[j](); j++}); //yeah, sure
}