2012-08-13 26 views
3

我的一個javascript代碼有點問題。下面是代碼Javascript:按值排列字符串

//assume array is an array containing strings and myDiv, some div in my doc 
for(var i in array) { 
    var myString = array[i]; 
    var a = document.createElement('a'); 
    a.innerHTML = myString; 
    a.addEventListener("click", function() {myFunc(myString)}, false); 
    myDiv.appendChild(a) 
} 
function myFunc(s) {alert(s);} 

然而,由於字符串由JavaScript中引用傳遞,我看到的永遠是我array的最後一個字符串,當我點擊相關鏈接a上。因此,我的問題是「我怎麼能通過myString的價值?」。感謝您的幫助 ! 菲爾

+4

使用'對... in'從未遍歷數組。 – jbabey 2012-08-13 15:11:42

+0

_MY EYES_'addEventListener'允許你_delegate_一個事件,而不是綁定到每個單獨的元素,你正在做這兩個事情,因此也不是:兩個世界中最糟糕的事情...... + addEventListener不支持IE <9 – 2012-08-13 15:18:23

+0

@EliasVanOotegem對於代表團來說你是對的,儘管使用委託處理程序仍然讓他面臨如何爲事件目標找到適當數據的問題。 – Alnitak 2012-08-13 15:19:33

回答

2

原始變量是不是在JavaScript中通過引用傳遞。

這是經典的'閉合變量內部閉環'問題。

這裏有一個常用的解決這一問題:

for (var i = 0, n = array.length; i < n; ++i) { 
    var myString = array[i]; 
    var a = document.createElement('a'); 
    a.innerHTML = myString; 
    a.addEventListener("click", make_callback(myString), false); 
    myDiv.appendChild(a) 
} 

function make_callback(s) { 
    return function() { 
     alert(s); 
    } 
} 

注意,這並沒有特別存儲器有效的,因爲它爲數組中的每個元素一個新的功能範圍。

一個更好的解決方案可能是將變量數據實際存儲在元素上(即作爲新屬性)並在回調中檢索。其實你已經存儲在.innerHTML屬性,字符串,所以你可以只讀取,然後採取代表團的優勢登記的元素的父只是一個處理程序:

for (var i = 0, n = array.length; i < n; ++i) { 
    var a = document.createElement('a'); 
    a.innerHTML = array[i]; 
    myDiv.appendChild(a) 
} 

myDiv.addEventListener('click', function(ev) { 
    alert(ev.target.innerHTML); 
}, false); 
-1

試試這個: 我認爲它總是好的做法不使用迭代陣......在

for(var i=0; i<array.length;i++) { 
    var myString = array[i]; 
    var a = document.createElement('a'); 
    a.innerHTML = myString; 
    a.addEventListener("click", function() {myFunc(myString)}, false); 
    myDiv.appendChild(a) 
} 
function myFunc(s) {alert(s);} 
+0

這是一個很好的改變,但它沒有解決他希望解決的問題。 – jbabey 2012-08-13 15:14:42