2013-03-10 62 views
1

我有以下代碼:的Javascript:傳遞「這個」值

function Selector() 
{ 
... 
this.items = new Array(); 
// i load here the items with dom-s 
this.setActiveItem = function(item) 
{ 
    this.items[item].className = "selector-item-active"; 
    ... 
} 
var _this = this; 
for (var i=0; i<itemsName.length; i++) 
    this.items[i].addEventListener("mouseup",function(){_this.setActiveItem(i)}); 
} 

的問題是,當偵聽器調用setActiveItem功能,然後我得到控制檯以下消息:

無法設置屬性「的className」的未定義

所以聽者無法通過這個值。

有沒有解決方法?

+0

我可能是錯的,但它看起來像你定義的數組項目的屬性,沒有定義的數組元素就是開始什麼。 – blackhawk 2013-03-10 21:08:44

+0

我認爲他是對的 – Dogoku 2013-03-10 21:09:33

+0

我認爲你的實際元素在這個數組中,所以你應該把'this.items [i]'傳遞給listener,而不是'this'。因此,把'_this'放在for裏面,像這樣:'var _this = this.items [i];',這可以解決你的問題(取決於你的數組是什麼)。 – Sygmoral 2013-03-10 21:10:28

回答

0

我的價值就等於itemsName.length在每當mouseUp事件執行。使用匿名函數來保存我;

修改後的代碼:

....... 
var _this = this; 
for (var i=0; i<itemsName.length; i++){ 
    (function(j){ 
      _this.items[j].addEventListener("mouseup", 
         function(){ 
           _this.setActiveItem(j); 
         } 
       ); 
      })(i);// preserve i for each for loop iterations 
} 
} 
+0

它的工作原理!謝謝! – hasyee 2013-03-10 21:56:35

1

事件偵聽器不保留它們所屬對象的this範圍。您還需要使用閉包將項目索引封裝到回調中。相反,嘗試引用使用_this(如你定義它)變量,就像這樣:

this.setActiveItem = function(item) 
{ 
    return function (evt) { 
     _this.items[item] = _this.items[item] || {}; 
     _this.items[item].className = "selector-item-active"; 
     ... 
    } 
} 

... 

for (var i=0; i<itemsName.length; i++) 
    this.items[i].addEventListener("mouseup", this.setActiveItem(i)); 
+0

我想,這個解決方案和Sushil的答案一樣。在這種情況下,您將返回setActiveItem函數中的內部函數。 – hasyee 2013-03-10 21:54:28