Как отменить событие scroll при достижении условия?

341
22 сентября 2017, 21:55

Допустим есть событие scroll $(window).scroll(function() { следящее за прокруткой. И когда пользователь прокрутил к определённому блоку, нужно чтобы появился скрытый блок, и после этого нужно отменить это событие scroll, чтобы больше не срабатывало это событие. Как это сделать?
https://jsfiddle.net/m40bs5kz/2/

$(window).scroll(function() { 
        var scroll = $(this).scrollTop(), 
            $title = $('h1'), 
            offsetTop = $title.offset().top, 
            height = $(window).height(); 
        if(scroll > ( offsetTop)){ 
            $('p').show(); 
            alert('stop scroll'); 
        } 
    });
.content{ 
  height: 1000px; 
  background: yellow; 
} 
.content2{ 
  height: 2000px; 
  background: green; 
} 
p{ 
  display: none; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div class="wrapper"> 
  <div class="content">content</div> 
  <h1>title</h1> 
  <p>paragraph</p> 
  <div class="content2">content2</div> 
</div>
нашёл решение такое: $(window).off('scroll'); но что делать, если к этому событию scroll прикручены другие обработчики, нужно отменить только один обработчик, приведённый выше?

Answer 1

Использовать event.namespace:

$(window).on('scroll.test', function() { ... });
$(window).off('scroll.test');
Answer 2

Задаёте флаг, по которому отслеживаете событие. И меняете его при наступлении. Например, так:

var flag = true;
$(window).scroll(function() {
    var scroll = $(this).scrollTop(),
        $title = $('h1'),
        offsetTop = $title.offset().top,
        height = $(window).height();
    if(scroll > offsetTop && flag == true){
        flag = false;
        $('p').show();
        alert('stop scroll');
    }
});

То есть событие сработает один раз (когда flag == true), а после того, как flag станет false, больше срабатывать не будет.

Answer 3

Выполняйте при скролле именованную функцию, тогда можно будет отключить запуск именно этой функции, а не всех обработчиков:

$(window).on('scroll', function() { 
  console.log('Another scroll action'); 
}); 
 
$(window).on('scroll', onScroll); 
 
function onScroll() { 
  const scroll = $(this).scrollTop(); 
   
  console.log('Scroll action'); 
   
  if(scroll > 300) $(window).off('scroll', onScroll); 
   
}
body { 
  height: 3000px; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

READ ALSO
Ограничения на название ключей в JSON

Ограничения на название ключей в JSON

Разбираю файл JSON с помощью JSONparse(); Выясняется такая вещь, что ключ с дефисом не работает

295
node js не работает на хостинге

node js не работает на хостинге

Возникла проблема с запуском node js серверной части на удаленном хостинге

358
Как написать юнит-тест на замыкание?

Как написать юнит-тест на замыкание?

не пойму, как такую функцию вызвать в юнит-тесте?

234