Все такие полезно иногда излогать свои мысли на публику, после написания вопроса в очередной раз полез читать про события в js. И нашел решение, если коротко - вешая на событие несколько действий
пользуйтесь пространствами имен.
Фактически мне нужно было разделить просто прокрутку страницы и прокрутку страницы, когда нужный блок появляется в области видимости. Решение:
scrollTracking()
Было:
function scrollTracking() {
var lastScrollTop = 0;
$(document).on('scroll', function () {
var currentScrollTop = $(this).scrollTop();
if (currentScrollTop > lastScrollTop) {
console.log('Прокрутка вниз');
} else {
console.log('Прокрутка вверх');
}
lastScrollTop = currentScrollTop;
});
}
Стало:
function scrollTracking() {
var lastScrollTop = 0;
$(document).on('scroll.scrollTracking', function () {
var currentScrollTop = $(this).scrollTop();
if (currentScrollTop > lastScrollTop) {
console.log('Прокрутка вниз');
} else {
console.log('Прокрутка вверх');
}
lastScrollTop = currentScrollTop;
});
}
И общая прокрутка:
return $(document).on('scroll.isShow', function () {
if (is_shown()) {
if (blockShow === null || blockShow === false) {
console.log('Блок ' + self.attr('class') + ' ПОЯВИЛСЯ');
scrollTracking();
}
blockShow = true;
} else {
$(document).off('scroll.scrollTracking',scrollTracking());
if (blockShow === null || blockShow === true) {
console.log('Блок ' + self.attr('class') + ' СКРЫТ');
}
blockShow = false;
}
})
Используя пространство имен, я безболезненно смог удалить обработчик:
$(document).off('scroll.scrollTracking',scrollTracking());
Оставив, общий, отвечающий за определение - находиться ли элемент в области видимости или нет