Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JS: именованный обработчик события в методе класса / 16 сообщений из 16, страница 1 из 1
27.11.2019, 17:40
    #39895185
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Приветствую всех!

Есть класс, управляющий движением элемента по экрану, в нем метод start():

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
start() {

        document.addEventListener('keydown', (event) => {
            ... <некий код> ...
        });

        document.addEventListener('keyup', (event) => {
             ... <некий код> ...
        });
}



Проблема в следующем: функциям-обработчикам нужно дать имена, чтобы в дальнейшем можно было сослаться на них для удаления EventListener. Пробовал делать их методами класса:

Код: javascript
1.
2.
3.
4.
5.
onKeyDown(event) {
}

onKeyUp(event) {
}



или даже глобальными:

Код: javascript
1.
2.
3.
4.
5.
function onKeyDown(event) {
}

function onKeyUp(event) {
}



- не работает. Только если код функции встраивается inline, тогда все ок.

Как победить проблему?
...
Рейтинг: 0 / 0
27.11.2019, 18:16
    #39895207
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
deGeneral,

странно, покажите код того, как пробовали
...
Рейтинг: 0 / 0
27.11.2019, 18:24
    #39895215
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Обработчик глобален:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function onKeyDown(event) {
...
}

class MoveController {

constructor (...) {
...
}

start() {

document.addEventListener('keydown', onKeyDown);

}

}



Обработчик является методом класса:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class MoveController {

constructor (...) {
...
}

onKeyDown(event) {
...
}

start() {

document.addEventListener('keydown', this.onKeyDown);

}

}



Вот так, если схематически, пробовал.
...
Рейтинг: 0 / 0
27.11.2019, 19:11
    #39895236
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
deGeneral,

у меня работает, Google Chrome версия 78.0.3904.108:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<!doctype html>
<html>
<head></head>
<body>
  <script>
    class MoveController {
      constructor () {
        this.start();
      }

      start() {
        document.addEventListener('keydown', this.onKeyDown);
      }
      
      onKeyDown(event) {
        console.log('MoveController.onKeyDown');
      }
    }

    let controller = new MoveController();
  </script>
</body>
</html>
...
Рейтинг: 0 / 0
27.11.2019, 21:21
    #39895264
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Да, действительно. Проблема, наверное, где-то внутри обработчика, буду искать!
...
Рейтинг: 0 / 0
27.11.2019, 21:49
    #39895268
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Вот она, проблемка! Оказывается, при одном и при другом варианте наш this - совершенно разные вещи! В случае, если обработчик безымянный inline this смотрит на сам класс MoveController и тогда его поля обрабатывает нормально и корректно, а если обработчик отдельный метод, то this почему-то смотрит на... document. Интересны причины такого поведения, ведь точка вызова-то по сути та же самая, а this определяется в момент вызова.
...
Рейтинг: 0 / 0
27.11.2019, 22:30
    #39895279
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
deGeneral
Вот она, проблемка! Оказывается, при одном и при другом варианте наш this - совершенно разные вещи

вот это вы открыли Америку :) потеря this
...
Рейтинг: 0 / 0
27.11.2019, 22:32
    #39895280
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Дмитрий Мух
deGeneral
Вот она, проблемка! Оказывается, при одном и при другом варианте наш this - совершенно разные вещи

вот это вы открыли Америку :) потеря this


Для себя - да, я в JS новичок.
...
Рейтинг: 0 / 0
27.11.2019, 22:34
    #39895281
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Вот, значит, если вкратце, как моя проблема обозначилась:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class MyClass {

    constructor(x) {
        this.x = x;
    }

    onKeyDown(event) {          // Если эту функцию привязать к EventListener,
        console.log(this);      // то this из нее будет смотреть на document, x не виден
    }

    start() {
        document.addEventListener('keydown', this.onKeyDown);
        document.addEventListener('keydown', (event) => {
            console.log(this);  // а отсюда this будет смотреть на объект класса MyClass и прекрасно увидит this.x
        });
    }

}

window.onload = function() {
    let c = new MyClass(5);
    c.start();
};



Как объяснить, почему так происходит?
Как сделать так, чтобы из поименованной функции виделся x?
...
Рейтинг: 0 / 0
27.11.2019, 22:38
    #39895283
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
У стрелочных функций нет «this»: https://learn.javascript.ru/object-methods#u-strelochnyh-funktsiy-net-this
...
Рейтинг: 0 / 0
27.11.2019, 22:44
    #39895285
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Дмитрий Мух
У стрелочных функций нет «this»: https://learn.javascript.ru/object-methods#u-strelochnyh-funktsiy-net-this


Но как раз таки из нее почему-то this.x виден!
...
Рейтинг: 0 / 0
27.11.2019, 22:50
    #39895286
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Понял, дошло.

Значит, из стрелочной функции this берется от метода start(), т.е. сам объект, и тогда получается, что поля объекта прекрасно видны.
Если функция с именем, то ее this не берется от внешнего контекста, а т.к. есть document, то вот он в итоге и получается.

С этим я, кажется, разобрался.

Но теперь, что с этой всей радостью делать? Мне нужен именованный обработчик, и из него я должен видеть поля объекта. А именованный обработчик нужен, чтобы написать метод stop(), который корректно и эротично его уберет, когда понадобится.
...
Рейтинг: 0 / 0
27.11.2019, 22:51
    #39895288
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
deGeneral
Дмитрий Мух
У стрелочных функций нет «this»: https://learn.javascript.ru/object-methods#u-strelochnyh-funktsiy-net-this


Но как раз таки из нее почему-то this.x виден!
дак прочитайте учебник
...
Рейтинг: 0 / 0
27.11.2019, 23:04
    #39895290
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
deGeneral
Но теперь, что с этой всей радостью делать? Мне нужен именованный обработчик, и из него я должен видеть поля объекта. А именованный обработчик нужен, чтобы написать метод stop(), который корректно и эротично его уберет, когда понадобится.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class MyClass {
  constructor(x) {
    self = this;
    self.x = x;
  }

  onKeyDown(event) {
    console.log(self.x);
  }

  start() {
    document.addEventListener('keydown', self.onKeyDown);
  }
}

window.onload = function() {
  let c = new MyClass(5);
  c.start();
};
...
Рейтинг: 0 / 0
27.11.2019, 23:19
    #39895293
deGeneral
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
Дмитрий Мух,

спасибо! Остается только лишь понадеяться, что если кто-то вдруг захочет поюзать этот класс где-то у себя, то он не потеряет какой-нибудь свой глобальный self :)
...
Рейтинг: 0 / 0
28.11.2019, 02:07
    #39895318
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS: именованный обработчик события в методе класса
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JS: именованный обработчик события в методе класса / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]