2012-06-20 30 views
0

我正在爲jQuery對話框創建動態按鈕。一個json對象包含按鈕的信息。我正在使用for for循環來遍歷對象中的每個屬性。當我遍歷新對象時,爲每個按鈕填充的匿名函數是空白的,但是顯示在對話框中實際單擊時,每個函數都使用最後一個值填充。在循環中的jquery動態按鈕對話框不會填充函數

代碼的對話框:

$('#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循環,但我認爲這是嵌套循環的範圍問題。我也沒有包含啓動這個功能的click事件的代碼,但這不是問題。

+0

如果您在分配的匿名函數前面插入了'var',這會起作用嗎? –

回答

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](); 
    } 
+0

謝謝!你做到了。我現在看到要設置返回函數,而不是在添加新對象的同時嘗試執行它。 – breakit2fixit

+0

爲什麼最初不工作? –

+0

由於for循環比返回函數更快,所以它最初沒有工作,所以在可以設置函數之前就完成了。 – breakit2fixit

相關問題