Задать вопрос
archi_kud
@archi_kud
Frontend Developer

Как остановить setTimeout?

Здравствуйте, делаю автоскролл для dnd. Когда перетаскиваемый элемент доходит до края экрана, начинается автоскролл.

Вот код:
if (item.getBoundingClientRect().right + 20 > document.body.getBoundingClientRect().width) {
    this.scroll(1, 'horizontal');
} else {
    this.scroll(0, 'horizontal', true);
}
     
scroll = (step, direction, stop = false) => {
    if (stop) clearTimeout(this.scrollId); // Не удаляет, т.к scrollId не совпадает
		
    if (direction === 'horizontal') { 
        document.documentElement.scrollLeft += step;
        this.scrollId = setTimeout(() => this.scroll(step, direction), 100); 
    }
};


Проблема в том, что scrollId при проверке stop не совпадает со scrollId, который я задаю.
P.S событие mousemove
  • Вопрос задан
  • 84 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
rockon404
@rockon404
Frontend Developer
У вас метод scroll вызывается как снаружи, так и изнутри. Это значит, что scroll может быть вызван несколько раз с direction: 'horizontal' и scroll: undefined и таймаутов у вас будет несколько. В scrollId будет записан последний идентификатор.
Ответ написан
Комментировать
joeberetta
@joeberetta Куратор тега JavaScript
Читай: https://epdf.pub/google-for-dummies.html
Почитайте про области видимости и про this в js.
У вас this.scrollId не туда обращается

Лучше id присвойте к переменной и через него удаляйте таймаут
Ответ написан
Ваш ответ на вопрос

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

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