@laguna1132

Где установить обработчик событий?

Добрый день. Хочу создать простой ES6 объект для открытия/закрытия меню. Создал метод open и close. А куда деть обработчик событий и почему?5a6331318e25b417239168.png
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Если вы хотите описать компонент, используемый в единственном экземпляре, то лучше использовать объект, а не класс. Обработчик событий может быть как в Menu, так и внешний:

const Menu = {
  el: document.getElementById('js-main-menu'),
  btn: document.getElementById('js-main-menu__btn'),

  init() {
    this.toggle = this.toggle.bind(this);
    this.close = this.close.bind(this);
    this.open = this.open.bind(this);

    this.btn.addEventListener('click', this.toggle);
  },

  toggle() {
    this.el.style.display = 
     !this.el.style.display || this.el.style.display === 'block' ? 'none' : 'block';
  },

  open() {
    this.el.style.display = 'block';
  },

  close() {
   this.el.style.display = 'none';
  }
}

export default Menu;


import Menu from './Menu';

const closeButton = document.getElementById('js-close-button');
const openButton = document.getElementById('js-open-button');

Menu.init();
closeButton.addEventListener('click', Menu.close);
openButton.addEventListener('click', Menu.open);


Демо: https://jsfiddle.net/ey53xuyp/

В случае с классом вешайте хандлеры в constructor:
class Menu {
  constructor({ el, btn }) {
     this.el = document.getElementById(el);
     this.el = document.getElementById(btn);

     this.toggle = this.toggle.bind(this);
     this.close = this.close.bind(this);
     this.open = this.open.bind(this);
     
     this.btn.addEventListener('click', this.toggle);
  }  
  ...
}

export default Menu;


import Menu from './Menu';

const closeButton = document.getElementById('js-close-button');
const openButton = document.getElementById('js-open-button');
const menu = new Menu({
  el: 'js-main-menu',
  btn: 'js-main-menu__btn',
});

closeButton.addEventListener('click', menu.close);
openButton.addEventListener('click', menu.open);


Если же вы хотите использовать компонентную архитектуру, с наследованием от базового класса компонента, вам лучше использовать React или Vue. Иначе рискуете написать трудно поддерживаемых, плохо масштабируемых велосипедов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@grinat
Кинь в конструктор и обработчик будет добавлен при создании класса.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
28 нояб. 2024, в 11:54
50000 руб./за проект
23 нояб. 2024, в 07:32
75000 руб./за проект
28 нояб. 2024, в 11:38
5000 руб./за проект