2013-07-09 151 views
0

我正在嘗試開發一個在html中創建菜單的JavaScript對象。 該函數接收一個對象作爲參數。對象元素中的一個函數應該在從我的對象的方法調用的事件處理函數中執行。無法調用未定義的方法

這裏是我的代碼:

Menu = function(config) { 
    var j = 0; 
    this.config = config; 
    this.make = function() { 
     for (i = 0; i < this.config.items.length; i++) { 
      var vid = document.createElement("div"); 
      vid.className = this.config.cls; 
      vid.id += i; 
      document.body.appendChild(vid); 
      var txt = document.createTextNode(this.config.items[i]); 
      var pp = document.createElement("p"); 
      pp.appendChild(txt); 
      vid.appendChild(pp); 
     } 

     document.addEventListener("keydown", this.scrolldown, false); 
     document.onkeydown = function(e) { 
      var keyCode = e.keyCode; 
      alert("functional"); 
      if (keyCode == 40) { 
       alert("You hit key down"); 

       var et = document.getElementById(j); 
       this.config.trait1(et); 
       j = j + 1; 
      } else { 
       alert("no"); 
      } 

     } 
    }; 

    return this; 
}; 

當我打電話的功能,使實例我有我的元素創建對象之後,但由於我的事件沒有被處理:

Uncaught TypeError: Cannot call method 'trait1' of undefined .

任何人都可以幫我?我看到了同一個問題的很多答案,但是沒有一個建議的解決方案可行。

+1

爲什麼你將現代事件處理程序綁定('document.addEventListener')與過時的事件處理程序綁定('document.onkeydown = function')混合? – Quentin

+0

我只是忘記刪除其中的一個。但是,你告訴我的錯誤是因爲'這'不是指我的對象。 – user2552861

回答

4

thisMenu函數內部是不一樣的this功能onkeydown內。

this的值存儲在另一個變量中並使用它。

Menu = function() { 
    var myMenu = this; // I'm assuming that you will be calling `new Menu()` 
    document.onkeydown = function() { 
     myMenu.config.etc.etc.etc 
    } 
} 
+0

謝謝sooooo多!! – user2552861

+0

有趣的也將是'this.scrolldown'這也是綁定到同一個事件。 – Christoph

+0

它現在可以完美工作:) – user2552861

相關問題