2013-07-04 27 views
-2

對不起,如果這看起來有點容易。我還是比較新的Javascript。不確定我很理解Javascript中的變量範圍

我正在生成複選框列表。在onClick複選框,我想讓它彈出其相關的文本。即。名爲「one」的複選框應顯示「one」。在我的例子中,它只顯示「兩個」。

但是,click()回調方法只調用最後一次添加的複選框的文本。這裏的'v'變量沒有被分配到每個複選框嗎?看起來'v'的行爲像一個全局變量。

this.view = document.createElement("div"); 

var tbody = document.createElement("tbody"); 
var popupValues = {"A", "B"}; 
for (var i=0;i<this.popupValues.length;i++) { 
    var v = popupValues[i]; 

    var tr = document.createElement('tr'); 
    var tdCheck = document.createElement('td'); 

    var ChkBx = document.createElement('input') 

    ChkBx.type = 'checkbox'; 

    tdCheck.appendChild(ChkBx); 

    var self = this; 

    $(ChkBx).live('change', function(){ 
     if($(this).is(':checked')){ 

      alert('checked' + v); 
     } else { 
      alert('un-checked' + v); 
     } 
    }); 


    var td = document.createElement("td"); 


    td.appendChild(document.createTextNode('' + v)); 
    tr.appendChild(tdCheck); 
    tr.appendChild(td); 


    tbody.appendChild(tr); 
} 

table.appendChild(tbody); 

document.appendChild(table) 

這裏的jsfiddle: http://jsfiddle.net/n5GZW/2/

任何人都知道我做錯了嗎?

更新:更新的jsfiddle

+0

你撥弄沒有做什麼... – Alvaro

+0

你確定嗎?我正在使用Chrome瀏覽器:http://jsfiddle.net/n5GZW/1/ –

+2

您尚未在小提琴中啓用jQuery – Alnitak

回答

2

你可以做

var table = document.createElement("table"); 
var tbody = document.createElement("tbody"); 


var popupValues = [ 
    "one", "two" 
]; 

for (var i = 0; i < popupValues.length; i++) { 

    var v = popupValues[i]; 

    var tr = document.createElement('tr'); 
    var tdCheck = document.createElement('td'); 

    var ChkBx = document.createElement('input'); 
    ChkBx.type = 'checkbox'; 
    ChkBx.value=v; 
    tdCheck.appendChild(ChkBx); 

    var td = document.createElement("td"); 
    td.appendChild(document.createTextNode('' + v)); 
    tr.appendChild(tdCheck); 
    tr.appendChild(td); 
    tbody.appendChild(tr); 


    var self = this; 

    $(ChkBx).click('change', function() { 
     if ($(this).is(':checked')) { 
      alert('check ' + $(this).val()); 
     } else { 
      alert('un-checked'); 
     } 
    }); 

} 

table.appendChild(tbody); 
document.body.appendChild(table)  

http://jsfiddle.net/n5GZW/4/
添加ChkBx.value=v;上點擊得到像$(this).val()

+0

這不會回答問題,它只會避免使用該變量。 – Guffa

2

你可能已經在尋找爲SO event binding in for loop

這裏是一個解決方案:

試試這個:

this.view = document.createElement("div"); 

var tbody = document.createElement("tbody"); 
var popupValues = {"A", "B"}; 
for (var i=0;i<this.popupValues.length;i++) { 
    var v = popupValues[i]; 

    var tr = document.createElement('tr'); 
    var tdCheck = document.createElement('td'); 

    var ChkBx = document.createElement('input') 

    ChkBx.type = 'checkbox'; 

    tdCheck.appendChild(ChkBx); 

    var self = this; 

    (function(val) { 
     $(ChkBx).on('change', function(){ 
     if($(this).is(':checked')){ 

      alert('checked' + val); 
     } else { 
      alert('un-checked' + val); 
     } 
     }); 
    })(v); 


    var td = document.createElement("td"); 


    td.appendChild(document.createTextNode('' + v)); 
    tr.appendChild(tdCheck); 
    tr.appendChild(td); 


    tbody.appendChild(tr); 
} 

table.appendChild(tbody); 

document.appendChild(table); 
+0

@oliverwatkins應該記住'.live'從jQuery 1.7開始被棄用,並且在1中被刪除。9 –

+0

@EduardGamonal:哎呀!讓我更新一下! – 2013-07-04 14:52:21

+0

你可以使用'.on()'而不是http://api.jquery.com/live/ –

3

「這裏的'v'變量是否被賦值爲每個複選框?」

那麼,它的分配,但沒有爲每個複選框聲明。

在Javascript變量中只有函數範圍。即使您嘗試在循環的每次迭代中創建一個新變量,它也只是在函數級別聲明的一個變量,由所有迭代共享。聲明被提升到功能級別,只有分配發生在循環內部。

您可以使用immediatey執行函數表達式創建另一個範圍的循環,在那裏你可以爲每個迭代創建一個新的變量中:

for (var i=0;i<this.popupValues.length;i++) { 
    (function(v){ 
    // code of the loop goes in here 
    // v is a new variable for each iteration 
    }(popupValues[i])); 
} 
+0

很酷的想法。不錯。 –

+0

我想我明白了。我認爲我誤導了,因爲我認爲局部變量只是本地的。但相對於內在的方法來說,我猜這有點兒全球化 –