@olya_097

Для чего var elem = options.elem; и и в чем разница и для чего в 31 строке файла JS change, и «index.html» addEventListener('change')?

сам код plnkr.co/edit/esbyCWqsImyBv8piJcte?p=preview
Помогите, пожалуйста

1) Для чего var elem = options.elem;
2) и в чем разница и для чего в 31 строке файла джс change, и индексхтмл addEventListener('change')?
3) bubbles: true,
detail: +vote
в чем суть
4) для чего elem.dispatchEvent(widgetEvent);?
  • Вопрос задан
  • 340 просмотров
Решения вопроса 1
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Уважаемая olya_097, в представленном Вами коде нет почти ничего из заданных вопросов (1 - нет, 3-нет, 4.нет)
попробую потелепатить, скорее всего речь идет о событийной модели браузера, и ответы вы найдете тут:
1. телепатия мне не помогла
2. подробно тут
3.
- bubbles: true - подробно тут
- detail: +vote - по всей видимости увеличение счетчика голосования
4. подробно тут


PS: был не прав :)

Павло Пономаренко, да действительно, не увидел
olya_097, был невнимателен, примите в качестве извинения за мой наезд:

/**
 * функция реализует логику "компонента" voter. Используется так:
 *   var voter = new Voter({
 *     elem: document.getElementById('voter')
 *   });
 * @param {object} options объект с параметрами, может содержать ключи
 *                         - elem ссылка на html элемент, содержащий в
 *                           себе кнопки уменьшения (html элемент с css 
 *                           классом class="down") и увеличения (html 
 *                           элемент с css классом class="up") а также 
 *                           элемент отображения текущего состояние (html 
 *                           элемент с css классом class="vote")
 * 
 */
function Voter(options) {
  // делаем ссылку на html элемент короче, чтобы не писать везде options.elem
  var elem = options.elem;

  // получаем дочерний элемент '.vote'
  var voteElem = elem.querySelector('.vote');

  // устанавливаем для 'компонента' voter обработчик события 'click'
  elem.onclick = function(event) {
    if (event.target.closest('.down')) {
      // если клик был по дочернему элементу '.down'
      voteDecrease();
    } else if (event.target.closest('.up')) {
      // если клик был по дочернему элементу '.up'
      voteIncrease();
    }
  }

  // устанавливаем для 'компонента' voter обработчик события 'onmousedown'
  elem.onmousedown = function() {
    return false;
  };

  // ----------- методы -------------

  // функция уменьшает значение в дочернем элементе '.vote' на единицу
  function voteDecrease() {
    setVote(+voteElem.innerHTML - 1);
    // где:
    // +voteElem.innerHTML - приведение строки voteElem.innerHTML к числу
    // +1 - добавляем 1 :)
  }

  // функция увеличивает значение в дочернем элементе '.vote' на единицу
  function voteIncrease() {
    setVote(+voteElem.innerHTML + 1);
    // где:
    // +voteElem.innerHTML - приведение строки voteElem.innerHTML к числу
    // +1 - добавляем 1 :)
  }

  // функция устанавливает дочернему элементу '.vote' значение равное
  // числу, переданному в параметре vote
  function setVote(vote) {
    voteElem.innerHTML = +vote;
    
    
    // создаем кастомный объект содержащий данные о событии
    var widgetEvent = new CustomEvent(
      // указываем имя кастомного событие "change". 
      "change", 
      // передав в качестве параметровнего данные о событии
      {
        bubbles: true, // тут расписано https://learn.javascript.ru/event-bubbling#vsplytie
        detail: +vote  // поле detail кастомного объекта события widgetEvent. Содержит текущее значение счетчика (+vote приводит значение vote к числу)

      }
    );
    // инициируем (вызываем) у "компонента" voter созданное событие "change"
    // c параметром detail содержащим установленное количество голосов
    elem.dispatchEvent(widgetEvent);
    // данное событие в данном конкретном случае мы ловим в index.html:
    // document.getElementById('voter').addEventListener('change', function(e) {
    //   alert(e.detail);
    // });
  };

  // экспортируем функцию setVote в глобальное пространство имен
  this.setVote = setVote;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Дополню ответ предыдущего оратора.

1. Просто чтобы было короче обращаться к переменной.
3. Вот про detail, +vote - это приведение к числу
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
1) Для чего var elem = options.elem;
Для уддобства, как и сказал @TheShock
2) и в чем разница и для чего в 31 строке файла джс change, и индексхтмл addEventListener('change')?
в 31 строке создание события

addEventListener - если перевести эту штуку на русский то будет "добавить слушатель события". Добавляется функция, которая ничего не делает пока событие не произойдет. А кгда оно произошло - эта функция тут-же и сработает. Круто?

3) bubbles: true,
detail: +vote
в чем суть
У события есть параметры - должно ли оно всплывать и какие там значения передаются, и где оно было создано, и еще куча всего. Эти две строки будут добавлены к стандартным параметрам.

4) для чего elem.dispatchEvent(widgetEvent);?
А вот это собственно "запуск" события.

Рекомендую почитать: https://learn.javascript.ru/introduction-browser-events
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы