2015-07-17 4 views
25

Ich erstellen einen Scroll-Effekt mit JQuery und ich frage mich, ob es möglich ist, zwischen dem Benutzer Scrollen vs programmgesteuertem Scrollen zu unterscheiden.Unterscheidung zwischen dem Benutzer Scrollen und programmgesteuert Scrollen mit Hilfe von Javascript

Ich habe so etwas wie dies:

$('#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:... 
    }); 
}); 

jedoch dieses Ereignis bei jedem Schritt der Animation ausgelöst wird. Wie kann ich feststellen, ob dieses Ereignis vom Benutzer oder von der Animation ausgelöst wurde?

+0

Sie suchen [event.originalEvent] (https://github.com/jquery/api.jquery.com/issues/319), siehe [Ereignisobjekt Dokumentation] (https://api.jquery.com/category/events/event-object/) unter ** Andere Eigenschaften ** und diese [Geige] (http://jsfiddle.net/xdv5mgua/) für ein Beispiel. –

+0

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

+0

Sie könnten versuchen, es mit dem "Rad" -Ereignis zu unterscheiden. Ein Benutzer kann sowohl 'rad'- als auch' scroll'-Ereignisse auslösen, während jQuery wahrscheinlich nur das 'scroll'-Ereignis auslöst. – Xufox

Antwort

8

eine Variable verwenden, um zu bestimmen, wenn Sie programmatisch

Beispiel scrollen:

var programScrolling = false; 

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

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

    programScrolling = true; 

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

    programScrolling = false; 
}); 

Nicht sicher, ob das ist genau das, was Sie wollen, aber das Konzept funktionieren soll.

+0

Der Benutzer sollte die Scroll-Animation jederzeit unterbrechen können (daher das $ ('# Element'). Stop (true) '). Dies würde dazu führen, dass der Benutzer die Animation nicht unterbrechen kann. –

+0

@Linksku Würde das '$ ('# Element'). Stop (true)' innerhalb der 'if' Bedingung für Ihr Szenario funktionieren? – developerbmw

+1

Nein, denn dann würde die Animation nach 1 Schritt stoppen. Ich habe auch bemerkt, dass der Körper der Bedingung niemals ausgeführt wird, weil 'programScrolling' immer falsch ist. –

1

Ich würde vorschlagen möglicherweise die .originalEvent Methode zu verwenden. Der Nachteil ist, dass dies sehr Browserabhängig ist. Siehe here. Hoffentlich wird die folgenden hilft:

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

Funktioniert nicht in Chrome –

2

Ich würde Funktionen machen für verschiedene Arten von scrollings sie zu erfassen und ein Scroll-Handler für alle von ihnen zu nennen, etwa so:

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); 
}; 

Dann Sie können je nach Herkunft des Ereignisses verschiedene Dinge tun!
Sie können auch überprüfen, ob der Benutzer in dieselbe Richtung scrollt, in der der Bildschirm scrollt, und etwas anderes machen oder was auch immer Sie wollen mit den Informationen, die das Mausrad-Ereignis übergibt.

Original-Mausrad Event-Funktion von THIS Antwort kopiert

+0

Mausrad hat begrenzte Unterstützung. Es funktioniert auch nicht, wenn der Benutzer mit der Bildlaufleiste oder auf Mobilgeräten scrollt. –

+0

Deshalb habe ich 'Mausrad DOMMouseScroll' verwendet, es gilt für IE9 + und alle gängigen Browser. Sie können auch ein '$ ('body') on ('touchmove', function (e) {') setzen und an die smoothScroll-Funktion weiterleiten, Richtung, Ursprung usw. Sie können das native Scrollen auch für Mobilgeräte beibehalten. –

+0

Sie können auch 'onmousewheel' zu der Funktion hinzufügen, die das Ereignis abfängt, um IE8 und darunter zu unterstützen –

Verwandte Themen