2011-10-11 186 views
0

我現在嘗試註冊一個canvas元素上的鼠標事件偵聽器。鼠標事件偵聽器和「本」

由於我的JS應用對象初始化時,它結合鼠標事件自定義「MouseController」類:

this.canvas.addEventListener('mousedown',this.input0.btnDown, false); 

「這個」正在初始化應用對象和帆布是基本的HTML5畫布的引用上我的頁面。

控制器是一個簡單的類,如:

function MouseController(eventHandler) { 
this.handler = eventHandler; 

this.contact = false; 

this.coordX = 0; 
this.coordY = 0; 
} 

MouseController.prototype.btnDown = function(event) { 
// Faulty line ??? 
this.updateCoordinates(event); 
} 

MouseController.prototype.updateHIDCoordinates = function (event) { 
// code to set coordX and coordY of the controller instance 
// Again, I can't access the object from here as "this" refers to the Canvas 
} 

當鼠標被點擊,控制檯日誌「的表達this.updateCoordinates'的結果是不是一個函數」。之前的討論教會了我有關引用「this」丟失的問題,最終導致綁定到本例中的Canvas項目。

所以我在尋找一種方式叫「btnDown」像我這一點在Java,這意味着它作爲執行對象的一部分,因此可以訪問該對象的變量。

我發現了一個單身......沒有好的:(我敢肯定有一個乾淨的解決方案唯一的解決辦法... 請:-)

謝謝幫忙! J.

回答

1

可以創建一個封閉:

var controller = this.input0; 
this.canvas.addEventListener('mousedown', function(event){ 
    controller.btnDown(event); 
}, false); 

或使用的ECMAScript 5的.bind()[MDN]

this.canvas.addEventListener('mousedown', this.input0.btnDown.bind(this.input0), false); 

另外請注意,您的另一種方法被稱爲updateHIDCoordinates,不updateCoordinates

+0

尼斯,它幫助! – Jem

+0

現在奇怪的是,當我的btnDown被調用時,我把它稱爲「this.handler.click()」。 「點擊()」的應用對象的方法只是簡單地調用: 的console.log(「點擊」 + this.input0.coordX); input0被設置爲一個成員變量。從控制器回來,「handler.input0」被設置爲空......任何想法爲什麼? 感謝 – Jem

+0

嗯,現在參考INPUT 0再次工程.. .wierd ......我肯定打破了沒有注意到/固定的東西。謝謝你的幫助! – Jem