javascript l oop через Dynami c массив элементов, получить значения, а затем использовать значения в качестве интервала для установки таймера обратного отсчета - PullRequest
0 голосов
/ 19 апреля 2020

Я делаю таймер, который будет использовать динамически введенную информацию для отображения таймера обратного отсчета для каждой записи. Таймер будет перебирать различные значения в нодлисте. Эти значения всегда будут числовыми c значениями. Вот пример: 20, 7, 20, 7, 20, 7, 90, 20, 7, 20, 7, 20, 7, 90

Эти значения представляют блоки секунд. Итак, 20 секунд, затем 7 секунд, затем 20 секунд, затем 7 и т. Д. c ...

Я хочу перебрать этот список, получить значения, а затем присвоить им значения в секундах и l * 1057. * через список, задерживающийся на определенное время каждый раз, когда новое значение зацикливается. Я добавлю еще один вложенный код в этом l oop, который отсчитывает таймер, установленный для каждого значения соответственно, но я пока не беспокоюсь о обратном отсчете, просто получая итерацию каждого блока секунд для правильного отсчета atm.

Таким образом, используя приведенный выше пример списка, я немедленно запускаю первое значение (20), приостанавливаю 20 секунд (его значение в секундах), затем запускаю следующее значение (7), приостанавливаю 7 секунд, затем запускаю следующее значение пауза для его значения в секундах, так до тех пор, пока не истечет весь список.

ПРИМЕЧАНИЕ: Эта информация всегда может отличаться для каждой отправки формы, поэтому код должен быть Динамо c в природе.

Вот самое близкое, что я когда-либо пытался сделать.

Сначала я собрал значения, используя Javascript:

const span = document.querySelectorAll('.selector');

span -> представляет входные записи, проходящие через различные циклы foreach в php, поступающие из разных записей, все со значением класса .selector, вставленным в каждый соответствующий входной тег. Формирование итерации по списку всегда будет правильно проиндексировано во времени для циклического перебора значений, как я описал.

Это дает мне список узлов.

Я собираю значения в foreach l oop, используя .textContent, затем я устанавливаю интервал в качестве переменной, получаю значение следующего брата, запускаю условные выражения, чтобы установить интервал, затем проверяю стрельбу l oop на согласованность. See my snippit below

span.forEach(function(value){
    const data = value.textContent;

    // Now that I have the nodelist values I run them through `setInterval`
    let delay = setInterval(engine => {
        const { value, set } = engine.next()
        if (set) {
            clearInterval(delay)
        } else {
            const values = value.textContent;
            console.log('firing delay -> ' + values);
        }  
    }, data * 1000, span[Symbol.iterator]())
})

Задержка срабатывает, но она непоследовательна и не успевает с необходимыми отсчетами секунд. Я не против использования другого метода для достижения этой цели, поскольку я новичок в JS и все еще учусь тому, как он работает на самом деле. Будем очень благодарны любой помощи!

Опять же, я хочу перебрать нодлист, получить его значения, использовать эти значения в виде блоков секунд, l oop, перебирая список для каждого значения в виде секунд, затем переходя к следующему значению до Список завершен.

ОБНОВЛЕНИЕ 4 мая 2020 года: Используя обновленный Cedrics, уменьшите код Я могу получить динамический таймаут c, работающий для отображения каждой итерации в списке узлов, используя его установленное значение в секундах, а затем отсчитайте эти секунды по отдельности.

const spans = [...document.querySelectorAll('.selector')];
const timerEl = document.getElementById('timer');
const count = spans.length;
function countDown(secs,elem){
    const timerEl = document.getElementById(elem);    
    timerEl.innerHTML = `${secs}`;    
    if(secs === 1){
        clearTimeout(timer);
        return timer;
    }    
    secs--;
    var timer = setTimeout('countDown('+secs+',"'+elem+'")',1000);
}

let i = 0;
spans.reduce((totalDelay, span) => {    
    setTimeout(() => {   
        const circuits = document.querySelectorAll('.selector');
        const circuit = circuits[i].innerText;         
        let alt = circuits[i].attributes[0].textContent;
        let time = delay;
        console.log(alt)                    
        console.log(`${circuit} -> ${delay}`);
        console.log(`${i + 1} of ${count}`);
        //need logic to figure out if node is last item in list then display finished
        countDown(delay,"timer");            
        i++;         
    }, 1000 * totalDelay);
    const delay = parseInt(span.textContent);
    totalDelay += delay;    
    return totalDelay;
}, 0);
<span alt="Workout" class="selector">5</span>
<span alt="Break" class="selector">3</span>
<span alt="Workout" class="selector">5</span>
<span alt="Break" class="selector">3</span>
<span alt="Workout" class="selector">5</span>
<span alt="Break" class="selector">3</span>
<span alt="Cool Down" class="selector">10</span>
<span alt="Workout" class="selector">5</span>
<span alt="Break" class="selector">3</span>
<span alt="Workout" class="selector">5</span>
<span alt="Break" class="selector">3</span>
<span alt="Workout" class="selector">5</span>
<span alt="Break" class="selector">3</span>
<span alt="Cool Down" class="selector">10</span>
<div id="timer"></div>

1 Ответ

1 голос
/ 19 апреля 2020

Если я правильно понимаю, и если я повторно использую ваш пример, вы захотите выполнить какой-то код через 20 секунд, а затем через 7 секунд, а затем через 20 секунд ... и т. Д.

Я предлагаю использовать setTimeout за каждый промежуток. Все они начинаются в одно и то же время. Первый использует задержку в 20 секунд, второй - 27 секунд (20 секунд от предыдущих setTimeout + 7 секунд), третий - 47 секунд (27 секунд от предыдущих setTimeout +). 20 секунд)… у вас есть идея.

Я использую reduce для отслеживания предыдущей задержки.

const spans = [...document.querySelectorAll('.selector')];

spans.reduce((totalDelay, span) => {
    
    setTimeout(() => {
        console.log(`firing delay -> ${delay}`);
    }, 1000 * totalDelay);
    
    const delay = parseInt(span.textContent);
    totalDelay += delay;
  
    return totalDelay;
}, 0);
<span class="selector">20</span>
<span class="selector">7</span>
<span class="selector">20</span>
<span class="selector">7</span>
<span class="selector">20</span>
<span class="selector">7</span>
<span class="selector">90</span>
<span class="selector">20</span>
<span class="selector">7</span>
<span class="selector">20</span>
<span class="selector">7</span>
<span class="selector">20</span>
<span class="selector">7</span>
<span class="selector">90</span>
...