Задать вопрос
@zlodiak

Как выглядят внутренности addEventListener()?

Помогите пожалуйста пролить свет на таинственную природу addEventListener() . Хотелось бы в общих чертах понять его работу. Далее я в очень упрощённом и схематичном виде представлю своё понимание. А вы пожалуйста поправьте меня, если буду не прав.

Рассмотрим такой простейший код навешивания обработчика на html-элемент:
<div id="btn">click me</div>

const btnEl = document.getElementById('btn');
console.dir(btnEl);
btnEl.addEventListener('click', (e) => {
	console.log('clicked', e);
});


  1. Так как любой html-элемент это объект, то видно, что
  2. у объекта вызывается метод addEventListener()
  3. в который передаётся два аргумента
  4. непосредственно у элемента #btn нет метода addEventListener(),
  5. поэтому поднимаемся по цепочке прототипов и находим его
  6. ок. этот метод принял два аргумента и теперь делает с ними что-то типа(далее схематичный код) такого:
function addEventListener(action, callback) {
  switch (action) {
    case 'click':
      callback();
      break;
    case 'mouseover':
      alert('bla bla');
      break;
    ....
    ....
    ...
  }
}


Это верный в общих чертах ход мысли? Я не пропустил чего-нибудь важного?

UPD1:
Новая версия моего хода мысли здесь: JSFIDDLE

UPD2:
Вот упрощённая модель с моей точки зрения: JSFIDDLE
  • Вопрос задан
  • 572 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Вы кое-что угадали, но пробелов больше чем правильных догадок.
Почитайте про event loop и вообще событийную модель.
https://developer.mozilla.org/ru/docs/Web/JavaScri...
https://learn.javascript.ru/introduction-browser-events
Ответ написан
@deight
class MyElement {
  constructor () {
    this.listeners = {}
    setTimeout(() => this.trigger('loaded'), 3000)
  }
  get (event) {
    return this.listeners[event] || (this.listeners[event] = new Set())
  }
  on (event, listener) {
    this.get(event).add(listener)
  }
  off (event, listener) {
    this.get(event).delete(listener)
  }
  trigger (event, ...args) {
    this.get(event).forEach(listener => listener(...args))
  }
}

const element = new MyElement()

const listener = () => console.log('it is loaded')

element.on('loaded', listener)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 13:47
2000 руб./в час
18 дек. 2024, в 13:22
30000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект