Имеется такая задача - на странице расположен блок. Страница скроллится, то есть наличествует событие scroll.
Нужно сделать так, чтобы при возникновении события scroll и выполнении определенного условия срабатывала некая функция. Но при этом срабатывала только один раз!
Вариантов решения этой задачи может быть несколько. В этой статье будут показаны два из них. Все они будут выполнены на JavaScript + jQuery.
Вариант первый - метод off()
Этот способ основан на методе jQuery - .off(). Как говорится в описании, метод
удаляет событие, вызванное с помощью метода 1
.off()
. То есть, выполняет обратную операцию.1
.on()
Рассмотрим пример ниже:
Что мы имеем в этом коде? Видим, что на окно
повешен обработчик ( метод 1
window
`) события scroll.1
.on()
При возникновении этого события выполняется проверка условия. Если условие true, то для каждого из элементов коллекции spins выполнить функцию.
Как только функция закончит свою работу, выполнение кода перемещается на строку
. Эта строка “говорит” - на объекте 1
$(window).off('scroll')
остановить событие scroll.1
window
Мы получили нужный результат - при событии scroll и выполнении условия функция выполнится только один раз.
Один важный момент - после выполнения строки
событие scroll будет “прибито” и дальнейшие попытки повесить handler на него не увенчаются успехом.1
$(window).off('scroll')
Другими словами, если дальше на странице есть еще элементы, на которых нужно обработать событие scroll, то ничего не получится.
Вариант второй - маркер
Второй способ не использует метод
, но применяет специальный маркер. Код простой, но эффективный. И в этом случае событие scroll не “убивается”, а функция исполняется один раз:1
.off()
Что есть в этом коде? Есть глобальная переменная
, у которой изначально значение 1
marker
.1
true
При выполнении условия функция
запускается и по ходу дела меняет значение 1
count()
на противоположный. Таким образом функция 1
marker
сработает только один раз.1
count()
Но событие scroll останется “невредимым”.
Заключение
За бортом остался еще один jQuery-метод - .one(). Его задача - также запустить на исполнение функцию только один раз.
Например, в коде ниже клик мыши на каждом из элементов коллекции likeLinks сработает только один раз:
Однако, применить метод
для обработки события scroll и вызова на исполнение функции только один раз у меня не получилось. Событие scroll вообще не срабатывало.1
.one()
На этом все. Похоже на то, что все верно написал и описал. Но если будут здравые комментарии и замечания, то буду только рад )
P.S. Сразу на ум пришло одно у самого себя - заменить
на переменную. Но уже лень менять. )1
$( window )