Помогите реализовать непрерывный перебор массива, что бы запуск и остановка перебора были по клику. Сейчас, по клику запускается перебор, и на div
вешается класс 'markup-lighting'
через toggle
. Так и нужно, но пробегает длину один раз и все, а мне нужно что бы после нажатия на start-button
, происходила итерация постоянно, пока не нажму на другую кнопку, к примеру stop - button
.
Код:
var startButton = document.querySelector('.start-button');
startButton.addEventListener("click", movement);
function movement() {
function markup(i) {
return function() {
console.log(i);
markupLeft[i].classList.toggle('markup-lighting');
}
}
for (var i = 0; i < markupLeft.length; i++) {
setTimeout(markup(i), i * 100);
}
}
Решение через setInterval
и clearInterval
:
// кнопка старт и обработчик клика на нее
var startButton = document.querySelector('.start-button');
startButton.addEventListener("click", start);
// кнопка стоп и обработчик клика на нее
var stopButton = document.querySelector('.stop-button');
stopButton.addEventListener("click", stop);
// идентификатор таймера
var timerId = null;
// заполним массив пятью элементами `div` (чтобы ваш пример кода работал в сниппете)
markupLeft = [];
for (var i = 0; i < 5; i++) {
var div = document.body.appendChild(document.createElement('div'));
markupLeft.push(div);
};
// функция запуска - запоминаем `timerId` (кнопка Start)
function start() {
// если таймер не запущен - запустить, иначе ничего не делать
if (!timerId) {
console.log('started');
timerId = setInterval(movement, 1000); // через секунду снова запустим
}
}
// функция остановки - останавливаем по `timerId` (кнопка Stop)
function stop() {
// если таймер запущен - остановить, иначе ничего не делать
if (timerId) {
console.log('stopped');
clearInterval(timerId); // остановить выполенение функции в `setInterval`
timerId = null; // обнулить таймер
}
}
// далее ваш старый код без изменений
function movement() {
function markup(i) {
return function() {
console.log(i);
markupLeft[i].classList.toggle('markup-lighting');
}
}
for (var i = 0; i < markupLeft.length; i++) {
setTimeout(markup(i), i * 100);
}
}
<button class="start-button">Start</button>
<button class="stop-button">Stop</button>
setInterval
- запускает выполнение функции и регулярно повторяет её
через указанный интервал времени, возвращает числовой идентификатор
таймера timerId
, который можно использовать для отмены действия.
Остановить исполнение можно вызовом clearInterval(timerId)
.
Для непрерывного можете использовать не for, а while(b), где
b = true;
при нажатии на кнопку start. При нажатии на кнопку finish
b = false;
Либо же после цикла for проверить, если счетчик дошел до конца массива, то перекинуть его на 0
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите пожалуйста оптимальное решениеУмею делать на jquery, но хочу научиться на чистом js
есть ли в js возможность сделать функцию и сразу её вызвать? Я знаю что так можно делать с анонимными функциями, но их нужно чему-то присваиватьА...
Подскажите пожалуйста, как можно передать значение выбранного select в onclick