fAntonM
@fAntonM
веб-разработчик, дизайнер

Как вывести наружу переменную из EventListener?

Здравствуйте, коллеги!
Столкнулся с проблемой вывода наружу в глобальную переменную значения из слушателя событий, а именно индекса в массиве DOM элементов.
Исходные данные:
1. массив элементов DOM
2. Метод forEach для сбора всех элементов
3. addEventListener - для получения индекса массива
Само собой сначала делается клик )).
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>

let indexNum; // undefined

 box.forEach((item, index) => {
      item.addEventListener('click', () => {
        console.log(index); // получил index 1 например
        indexNum = index;
        console.log(indexNum); // 1
        // как передать наружу indexNum?? 
      });
    });

Вопрос:
Необходимо индекс массива сделать глобальной переменной.
Как вывести наружу метода forEach переменную indexNum?
  • Вопрос задан
  • 1101 просмотр
Решения вопроса 1
fAntonM
@fAntonM Автор вопроса
веб-разработчик, дизайнер
Спасибо всем)

Делаю правку своего ответа на следующий день. Разобрался).

1. Есть массив DOM элементов, повешен обработчик, КЛИКАЕМ на любом элементе в начале и получаем его переменную Index.
2. Index теперь видна во всем внешнем коде. ( еще раз - ПОСЛЕ клика). В редакторе кода вы просто так не получите значение Index через console.log(indexNum). Но в Devtools - получите.
3. Также, если внутри обработчика вызвать функцию и передать в аргументе Index то при клике функция сразу отработает и выдаст значение в консоль

- Это уже решает мою задачу, так как ранее я считал, что получить Index смогу только после дополнительных кликов в других местах кода и прочих танцев.

На всякий случай еще раз повторяю код с моими комментами, для себя и тех кто также не видит в консоли значения в глобальной переменной.
<div class="box ">1</div>
<div class="box ">2</div>
<div class="box ">3</div>

//Для тех кто в танке - далее все действия и комменты рассматриваются только после клика на DOM элементе

    let indexNum; // глоб. переменная, но можно и без нее выводить Index как есть
    let arr = []; // макссив для примера
    console.log(arr); // получу индекс из массива DOM, но увидеть весь массив arr можно в консоли DevTools
    console.log(arr[0]); //  также смотри в консоли DevTools


    // Вызвали ф. из обработчика и передали Index
    function test(index) {
      let a = index;
      console.log(a); // выдает после клика, т.к. функция начала работать после клика и получила значение Index
      console.log(`Из массива arr ${arr[0]}`);
    }
    console.log(indexNum); // так не увидешь никогда

    box.forEach((item, index) => {
      item.addEventListener('click', () => {
        indexNum = index;
        arr.push(index); // пушим для примера в массив arr

        test(indexNum); //вызываем для примера ф. и передаваем значение именно отсюда 
      });
    });
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Через глобальный объект window как вариант
window.indexNum = index;
console.log(window.indexNum);
Ответ написан
ThunderCat
@ThunderCat Куратор тега JavaScript
{PHP, MySql, HTML, JS, CSS} developer
let будет неглобальной, используйте var
var indexNum;

UPD: Я понял, вы конечно тупите, но я наконец понял как вы тупите, ща попробую объяснить для одаренных:
let indexNum; // нужно получить сюда индекс (тольуо нужно var, а не let)
// вот тут будет немного сложно, включаем мозг...
    box.forEach((item, index) => { //мы делаем цикл, и набрасываем слушатели(!)
      item.addEventListener('click', () => { //которые могут вообще никогда не случиться, или случиться через час
        indexNum = index; //и ТОЛЬКО ТОГДА в indexNum что-то появится, на текущий момент мы только объяснили 
//что делать по клику, пока это только команда сделать что-то в случае чего-то, indexNum до тех пор пустой
      });
    });
// тут indexNum все еще пустой, так как мы не умеем кликать на объекты быстрее чем исполняется код.

    mainWrapper.addEventListener('click', () => {
      console.log(indexNum); // выведет предыдущее значение индекса при первом клике
// но помним, что клика еще нет!
    });
// и тут клика еще нет
    for (let index = 0; index < 3; index++) {
      console.log(indexNum); // но здесь undefined, а именно здесь индекс и нужен
// не "но", а здесь клика еще нет, а вы пытаетесь получить его значение.
//код выполнился, теперь можете кликать, но теперь ваш фор уже вызываться не будет.
    }

Теперь что надо сделать: Вынести ваш код в функцию, и функцию вызывать внутри евента.
Ответ написан
Ваш ответ на вопрос

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

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