Функция jQuery - предотвращает получение возвращений "на время"
Я проверяю направление прокрутки с помощью wheelDelta, но он сразу возвращает множество свойств прокрутки. Мне нужно только знать, работает ли он или нет, и он не должен возвращать значение менее 500 мс после первого запуска. Я пытался поиграть с setTimeout, но не смог решить это красиво. Есть идеи?
var distance = $('.section-two').offset().top,
$window = $(window);
$window.scroll(function() {
if ( $window.scrollTop() >= distance ) {
$('body').css('overflow', 'hidden');
setTimeout(function(){
$(document).bind('mousewheel', function(evt) {
var delta = evt.originalEvent.wheelDelta;
if(delta > 0){
console.log('scrolled up')
} else {
console.log('scrolled down');
}
})
}, 500);
}
});
Вот пример кода
3 ответа
Можете ли вы попробовать открепить 'mousewheel'
событие, прежде чем связать его. Кажется, это связывает это снова и снова. добавлять $(document).unbind('mousewheel');
перед $(document).bind('mousewheel', function(evt) {
линия.
Попробуйте использовать Lodash для регулирования события. Вы должны быть в состоянии сохранить предыдущее смещение и определить направление прокрутки из этого:
var lastScrollTop = 0;
function scrollHandler() {
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
if (scrollTop > lastScrollTop){
console.info('scrolled down');
} else {
console.info('scrolled up');
}
lastScrollTop = scrollTop;
}
window.addEventListener('scroll', _.throttle(scrollHandler, 500))
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
Решено с более правильным setTimeout: пример codepen
var doMouseWheel = true;
$(document).bind("mousewheel", function(event, delta)
{
// it'll just not do anything while it's false
if (!doMouseWheel)
return;
// here's where you were unbinding, now just turning false
doMouseWheel = false;
// do whatever else you wanted
var delta = event.originalEvent.wheelDelta;
if(delta > 0){
console.log('scrolled up')
} else {
console.log('scrolled down');
}
// here's where you were rebinding, now wait 200ms and turn on
setTimeout(turnWheelBackOn, 800);
});
function turnWheelBackOn() { doMouseWheel = true; }