Слушатель событий мыши и «это» - PullRequest
0 голосов
/ 11 октября 2011

Я сейчас пытаюсь зарегистрировать прослушиватель событий мыши на элементе canvas.

Когда инициализируется мой объект приложения JS, он связывает события мыши с пользовательским классом "MouseController":

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

«this» - это инициализируемый объект приложения, а canvas - ссылка на базовый 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
}

Asпри щелчке мыши консоль регистрирует «результат выражения this.updateCoordinates 'не является функцией».Предыдущее обсуждение научило меня тому, что ссылка «это» теряется, и в этом случае она привязывается к элементу Canvas.

Так что я ищу способ вызвать «btnDown», как если бы яв Java это означает, что он выполняется как часть объекта и, следовательно, имеет доступ к переменным этого объекта.

Единственное решение, которое я нашел, было синглтоном ... Ничего хорошего :( Я уверен, что естьЧистый раствор ... Пожалуйста, помогите: -)

Спасибо!J.

1 Ответ

1 голос
/ 11 октября 2011

Либо создайте замыкание:

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

или используйте ECMAScript 5's .bind() [MDN] :

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

Также обратите внимание, что ваш другой метод называется updateHIDCoordinates, а не updateCoordinates.

...