Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Срабатывание функции один раз при динамически меняющемся условии (https://javascript.ru/forum/misc/85339-srabatyvanie-funkcii-odin-raz-pri-dinamicheski-menyayushhemsya-uslovii.html)

Volonter 04.07.2023 08:49

Срабатывание функции один раз при динамически меняющемся условии
 
Всем привет, есть переменная меняющаяся динамически
let offset; // number, value 0, 1, 1.2, 100, 120 ... etc

мне нужно как то задать условие, чтобы при значении offset > 100
вызывалась функция, но только один раз , о в обратную сторону так же, примерно так
if(offset > 100) {
 // функция сработала один раз
} else if(offset < 100) {
 // функция опять сработала один раз
}

то есть, получив значение 100, 101 или 102 или любое число более 100 мы вызвали функцию и забыли о ней, пока не получим 99, 98 или любое число менее 100 и потом опять забыли.
Заранее благодарен!

Alexandroppolus 04.07.2023 09:59

let offset = 0;

function func() {
    alert('preved');
}

function updateOffset(v) {
    const exec = v > 100 && offset <= 100 || v < 100 && offset >= 100;
    offset = v;
    if (exec) {
        func(); //  вызов функции
    }
}

Volonter 04.07.2023 10:41

Alexandroppolus,
Спасибо! Но я не смог разобраться, если честно. Аргументом для функции
updateOffset() при ее вызове мне надо передавать offset? А для чего тогда мы его объявляем как let offset = 0; ведь он у нас есть уже?

voraa 04.07.2023 12:08

В let offset хранится предыдущее значение.
А как параметр функции при вызове передается текущее значение.

updateOffset(10);
updateOffset(20);
updateOffset(101); // сработало
updateOffset(110);
updateOffset(120);
updateOffset(105);
updateOffset(99);  // сработало
updateOffset(80);

Volonter 04.07.2023 12:15

Цитата:

Сообщение от voraa (Сообщение 552629)
В let offset хранится предыдущее значение.
А как параметр функции при вызове передается текущее значение.

updateOffset(10);
updateOffset(20);
updateOffset(101); // сработало
updateOffset(110);
updateOffset(120);
updateOffset(105);
updateOffset(99);  // сработало
updateOffset(80);

Да, я разобрался, но у меня почему то срабатывает на любом значении

voraa 04.07.2023 12:17

Цитата:

Сообщение от Volonter
при ее вызове мне надо передавать offset

Ну переименуйте какую-нибудь из переменных
Например так
let previousOffset = 0;
 
function func() {
    alert('preved');
}
 
function updateOffset(v) {
    const exec = v > 100 &&  previousOffsetoffset <= 100 || v < 100 &&  previousOffset >= 100;
    previousOffset = v;
    if (exec) {
        func(); //  вызов функции
    }
}

voraa 04.07.2023 12:18

Цитата:

Сообщение от Volonter (Сообщение 552630)
Да, я разобрался, но у меня почему то срабатывает на любом значении

Код свой покажите

Volonter 04.07.2023 12:34

Цитата:

Сообщение от voraa (Сообщение 552632)
Код свой покажите

Я использую плагин Gsap Smooth Scroll, при прокручивании страницы вызывается событие
bodyScrollBar.addListener(function(status){
  // прокрутка страницы
  // status.offset.y - отступ сверху
let offset = 0;
function collapseHeader() {
                $('.header__top').slideToggle(350);
            }

            function updateOffset(v) {
                const exec = v > 100 && offset <= 100 || v < 100 && offset >= 100;
                offset = v;
                if (exec) {
                    collapseHeader();
                }
            }

            updateOffset(status.offset.y)

образно говоря, мне нужно скрывать хедер при прокрутке более 100 пикселей и раскрывать когда страница проскролена наверх.
Но чего то идет не так))

voraa 04.07.2023 12:57

Не знаю ничего про этот плагин, но каждый раз, когда срабатывает обработчик, заданный в
bodyScrollBar.addListener(function(status){
у вас заводится внутри функции переменная
let offset = 0;
Зачем внутри обработчика каждый раз объявлять переменную и функции? Вынесите их во вне.
let offset = 0;
function collapseHeader() {
                $('.header__top').slideToggle(350);
            }
 
            function updateOffset(v) {
                const exec = v > 100 && offset <= 100 || v < 100 && offset >= 100;
                offset = v;
                if (exec) {
                    collapseHeader();
                }
            }

bodyScrollBar.addListener(function(status){
  // прокрутка страницы
  // status.offset.y - отступ сверху
 
            updateOffset(status.offset.y)

Volonter 04.07.2023 13:08

voraa,
Спасибо! Работает!

Volonter 04.07.2023 15:16

Alexandroppolus,
Спасибо вам огромное, решение полностью рабочее, это я уже косячил что не получалось. Все отлично, еще раз вам спасибо!


Часовой пояс GMT +3, время: 18:20.