2015-07-17 2 views
25

Я создаю эффект прокрутки с помощью JQuery, и мне интересно, можно ли отличать прокрутку пользователя от программной прокрутки.Отличие между прокруткой пользователя и программной прокруткой с помощью Javascript

У меня есть что-то вроде этого:

$('#element').on('scroll',function(e){ 
    $('#element').stop(true); // stop previous scrolling animation 
    $('#element').animate({ // start new scrolling animation (maybe different speed, different direction, etc) 
     scrollTop:... 
    }); 
}); 

Однако это событие срабатывает при каждом шаге анимации. Как узнать, вызвано ли это событие пользователем или анимацией?

+0

Вы ищете [event.originalEvent] (https://github.com/jquery/api.jquery.com/issues/319), см [объект события документация] (https://api.jquery.com/category/events/event-object/) в разделе ** Другие свойства ** и этот [скрипт] (http://jsfiddle.net/xdv5mgua/) для примера. –

+0

http://stackoverflow.com/questions/1659204/call-scroll-only-when-user-scrolls-not-when-animate/1659231#1659231 – FuzzyTree

+0

Вы можете попробовать отличить его от события 'wheel'. Пользователь может запускать как события «wheel», так и 'scroll', тогда как jQuery, вероятно, только запускает событие' scroll'. – Xufox

ответ

8

Используйте переменную для определения того, когда вы прокручиваете программно

Пример:

var programScrolling = false; 

$('#element').on('scroll',function(e){ 
    if (programScrolling) { 
     return; 
    } 

    $('#element').stop(true); // stop scrolling animation 

    programScrolling = true; 

    $('#element').animate({ 
     scrollTop:... 
    }); 

    programScrolling = false; 
}); 

Не уверен, что это именно то, что вы хотите, но концепция должна работать.

+0

Пользователь должен иметь возможность прерывать прокручивающую анимацию в любое время (отсюда '$ ('# element'). Stop (true)'). Это сделало бы его таким, чтобы пользователь не мог прервать анимацию. –

+0

@Linksku Помещает '$ ('# element'). Stop (true)' внутри условия 'if' работает для вашего сценария? – developerbmw

+1

Нет, потому что анимация остановится после 1 шага. Я также заметил, что тело условного оператора никогда не будет запущено, потому что 'programScrolling' всегда будет ложным. –

1

Возможно, я предположил бы, используя метод .originalEvent. Недостатком является то, что это зависит от браузера. См. here. Будем надеяться, что следующий помогает:

$('#element').scroll(function(e){ 
    var humanScroll = e.originalEvent === undefined; 
    if(humanScroll) { 
     $(this).stop(true); 
    } 
}) 
+5

Не работает в Chrome –

2

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

JS Fiddle

$(window).bind('mousewheel DOMMouseScroll', function(event){ 
    var direction; 
    if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) { 
     direction = 'up'; 
    } 
    else { 
     direction = 'down'; 
    } 
    scrollHandler(direction, 'mouseWheel'); 
    event.preventDefault(); 
}); 

var scrollHandler = function(direction, origin) { 
    var height = $(document).scrollTop(); 
    var movement = (direction == 'up') ? -100 : 100; 
    console.log(origin); 
    $('body').stop(true); 
    $('body').animate({ 
     scrollTop: height + movement 
    }, 250); 
}; 

Тогда вы можете делать разные вещи в соответствии с происхождением события!
Вы также можете проверить, прокручивается ли пользователь в том же направлении, в котором прокручивается экран, и делать что-то другое или все, что вы хотите, с информацией, переданной событием mousewheel.

Оригинальная функция MouseWheel событие копируется из THIS ответа

+0

'mousewheel' имеет ограниченную поддержку. Кроме того, он не работает, если пользователь прокручивает страницу с помощью полосы прокрутки или на мобильном устройстве. –

+0

Вот почему я использовал «mousewheel DOMMouseScroll», это относится к IE9 + и ко всем основным браузерам. Вы также можете сделать '$ ('body'). On ('touchmove', function (e) {' и перейти к функции smoothScroll, что угодно, направление, начало. Вы также можете оставить естественную прокрутку для мобильных устройств. –

+0

Вы также можете добавить 'onmousewheel' к функции, которая поймает событие для поддержки IE8 и ниже –

Смежные вопросы