Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.07.2023, 08:49
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

Срабатывание функции один раз при динамически меняющемся условии
Всем привет, есть переменная меняющаяся динамически
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 и потом опять забыли.
Заранее благодарен!
Ответить с цитированием
  #2 (permalink)  
Старый 04.07.2023, 09:59
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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(); //  вызов функции
    }
}
Ответить с цитированием
  #3 (permalink)  
Старый 04.07.2023, 10:41
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

Alexandroppolus,
Спасибо! Но я не смог разобраться, если честно. Аргументом для функции
updateOffset() при ее вызове мне надо передавать offset? А для чего тогда мы его объявляем как let offset = 0; ведь он у нас есть уже?
Ответить с цитированием
  #4 (permalink)  
Старый 04.07.2023, 12:08
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,710

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

updateOffset(10);
updateOffset(20);
updateOffset(101); // сработало
updateOffset(110);
updateOffset(120);
updateOffset(105);
updateOffset(99);  // сработало
updateOffset(80);
Ответить с цитированием
  #5 (permalink)  
Старый 04.07.2023, 12:15
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

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

updateOffset(10);
updateOffset(20);
updateOffset(101); // сработало
updateOffset(110);
updateOffset(120);
updateOffset(105);
updateOffset(99);  // сработало
updateOffset(80);
Да, я разобрался, но у меня почему то срабатывает на любом значении
Ответить с цитированием
  #6 (permalink)  
Старый 04.07.2023, 12:17
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,710

Сообщение от 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:20.
Ответить с цитированием
  #7 (permalink)  
Старый 04.07.2023, 12:18
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,710

Сообщение от Volonter Посмотреть сообщение
Да, я разобрался, но у меня почему то срабатывает на любом значении
Код свой покажите
Ответить с цитированием
  #8 (permalink)  
Старый 04.07.2023, 12:34
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

Сообщение от voraa Посмотреть сообщение
Код свой покажите
Я использую плагин 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 пикселей и раскрывать когда страница проскролена наверх.
Но чего то идет не так))

Последний раз редактировалось Volonter, 04.07.2023 в 12:43.
Ответить с цитированием
  #9 (permalink)  
Старый 04.07.2023, 12:57
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,710

Не знаю ничего про этот плагин, но каждый раз, когда срабатывает обработчик, заданный в
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)
Ответить с цитированием
  #10 (permalink)  
Старый 04.07.2023, 13:08
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

voraa,
Спасибо! Работает!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вызов функции при смене url vvsh Events/DOM/Window 4 11.08.2011 19:01
При выполнение строки кода вылетаю из функции. developer_ Events/DOM/Window 3 28.07.2011 00:45
Двойное срабатывание функции Askhsiv Элементы интерфейса 2 22.06.2010 17:36
Окно открывается только один раз altermann ExtJS 8 22.04.2010 11:55
Чтоб ссылка появлялась один раз для каждого пользователя (по IP или Cookies) Sequoia Общие вопросы Javascript 2 28.01.2010 19:16