2012-05-30 6 views
0

У меня возникли проблемы с добавлением слушателя событий. Я в основном герметизирующего все клавиатурные функции, связанные в классе JavaScript следующим образом:addEventListener не работает внутри функции

function Keyboard() 
{ 
    this.key = new Array(); 

    for(x=0;x<255;x++) 
    { 
     this.key[x] = false; 
    } 

    function keyDown(evt) 
    { 
     this.key[evt.keyCode] = true; 
     console.log("Keydown bioch"); 
    } 

    function keyUp(evt) 
    { 
     this.key[evt.keyCode] = false; 
    } 

    window.addEventListener('keydown', this.keyDown, true); 
    window.addEventListener('keyup', this.keyUp, true); 
} 

Кроме того, что он не работает - вообще. Когда я удаляю функцию Keyboard и делаю все глобальным (клавиши [], keyDown, keyUp и addEventListener, все работает.

Что я делаю неправильно?

+2

Вы создали экземпляр класса? Вы выполнили эту функцию? – Joseph

ответ

3

Вы используете this keyword, где это не подходит. Кроме того, ваши объекты не имеют свойств keyDown/keyUp.

Вам нужно будет разыменовать массив, так как в прослушивателе будет указывать на элемент приема события (dom), который не имеет свойства key. И ссылаться на свои локальные функции, просто использовать их имена:

function Keyboard() { 
    var arr = this.key = new Array(); 
    for(x=0;x<255;x++) 
     arr[x] = false; 

    function keyDown(evt) { 
     arr[evt.keyCode] = true; 
     console.log("Keydown bioch"); 
    } 
    function keyUp(evt) { 
     arr[evt.keyCode] = false; 
    } 

    window.addEventListener('keydown', keyDown, true); 
    window.addEventListener('keyup', keyUp, true); 
} 
+1

@Sosukodo: Более того, когда вы делаете глобальный контент класса KeyBoard, все работает, потому что «this.keyDown» и «this.keyUp» ссылаются на «глобальный объект Window» (окно). Он содержит функции keyDown и keyUp, такие как методы, и вы можете ссылаться на них с ключевым словом this. – bitfox

+0

... но вы не должны, да. Я был совершенно уверен, что он назвал бы это «новым». – Bergi

+0

Ваш код верен. Мой комментарий - всего лишь примечание для объяснения поведения в глобальной области. – bitfox

0

«это» ссылка в функции обратного вызова ссылается на объекте окна, а не область видимости функции, как вы могли бы ожидать.

См. Этот ответ.

JavaScript Callback Scope

+0

Я также оценил ваш ответ. Тем не менее, я склонен принимать те ответы, которые дают полный пример кода + объяснение. –