0

我正在为 jQuery 对话框创建动态按钮。一个 json 对象包含按钮的信息。我正在使用 for in 循环来遍历对象中的每个属性。当我遍历新对象时,为每个按钮填充的匿名函数是空白的,但在对话框中实际单击时显示每个函数都填充了最后一个值。

对话框代码:

$('#dialogDiv').dialog({
        autoOpen:false,
        modal:true,
        resizable:false,
        width: 600,
        height:100,
        position:"center",
        overlay: { 
            opacity: 0.2, 
            background: "black" 
        } 
});

从 json 对象创建按钮的代码:

var obj1 = {but1:{Label:"button1"},but2:{Label:"button2"},but3:{Label:"button3"}};
var newObj = {};
for(var k in obj1){
    if (obj1.hasOwnProperty(k)){ 
        var ob2 = obj1[k];
        for(var x in ob2){
            var nl = ob2[x];
             newObj[nl] = function(){
                $(this).dialog("close");
                console.log(nl);
             }
        }
    }
}

如果我遍历 newObj 每个函数都是空白的。

for(var z in newObj){
    console.log(newObj[z]);
}

将按钮对象添加到对话框并打开它。

$('#dialogDiv').dialog({buttons : newObj});             
$('#dialogDiv').dialog("open");

当单击任何按钮时,控制台会显示它们对于函数内的 nl ​​变量都有相同的值。为什么没有正确设置?变量范围?我知道如果不使用第二个 for 循环,这可能会更容易编写,但我认为这是嵌套循环的范围问题。我也没有包含触发执行此操作的函数的单击事件的代码,但这不是问题。

4

1 回答 1

1
var obj1 = { but1: { Label: "button1" }, but2: { Label: "button2" }, but3: { Label: "button3" } };
    var newObj = {};
    for (var k in obj1) {
        if (obj1.hasOwnProperty(k)) {
            var ob2 = obj1[k];
            for (var x in ob2) {
                var nl = ob2[x];
                var testfn = function (j) {
                    return function () {
                        alert("clicked on" + j);
                    }
                }
                newObj[nl] = testfn(nl);
            }
        }
    }


    for (var z in newObj) {
        newObj[z]();
    }
于 2012-06-20T18:48:08.153 回答