Kann festgestellt werden, ob ein Bildlaufereignis vom Browser oder vom Benutzer ausgeführt wurde? Insbesondere bei Verwendung der Zurück-Taste kann ein Browser zur letzten bekannten Bildlaufposition springen. Wenn ich an ein Bildlaufereignis binde, wie kann ich feststellen, ob dies vom Benutzer oder vom Browser verursacht wurde?
$(document).scroll( function(){
//who did this?!
});
Ich sehe drei Arten von Situationen, die ein Scrollen in einem Browser verursachen.
- Der Benutzer führt eine Aktion aus. Verwendet beispielsweise Mausrad, Pfeiltasten, Bild-auf / ab-Tasten, Home- / End-Tasten.
- Der Browser scrollt automatisch. Wenn Sie beispielsweise die Zurück-Schaltfläche in Ihrem Browser verwenden, wird automatisch zur letzten bekannten Bildlaufposition gesprungen.
- Javascript-Schriftrollen. Zum Beispiel
element.scrollTo(x,y)
.
javascript
jquery
mrtsherman
quelle
quelle
Antworten:
Leider gibt es keine direkte Möglichkeit, dies zu sagen.
Ich würde sagen, wenn Sie Ihre App so umgestalten können, dass sie nicht von dieser Art von Flow abhängt, entscheiden Sie sich dafür.
Wenn nicht, besteht eine Problemumgehung darin, vom Benutzer initiierte Schriftrollen zu verfolgen und zu überprüfen, ob der Bildlauf vom Browser oder vom Benutzer ausgelöst wurde.
Hier ist ein Beispiel, das ich zusammengestellt habe und das dies ziemlich gut macht (mit Ausnahme von Browsern, mit denen der jQuery-Verlauf Probleme hat).
Sie müssen dies lokal ausführen, um es vollständig testen zu können (jsFiddle / jsbin passen nicht gut zusammen, da sie den Inhalt iFrame).
Hier sind die Testfälle , die ich validiert habe:
userScroll
istfalse
userScroll
wirdtrue
userScroll
wirdfalse
userScroll
wirdfalse
;Anmerkungen:
event.keyCodes
kann je nach Betriebssystem variieren, daher müssen Sie dies möglicherweise entsprechend ändern.Hoffe das hilft!
quelle
event.thrower
Eigentum ?! ).Soweit ich weiß, ist es unmöglich (ohne Arbeit) zu sagen, wann ein Bildlaufereignis von "Benutzer" oder auf andere Weise ausgegeben wurde.
Sie könnten versuchen (wie bereits erwähnt), Mausradereignisse abzufangen, und dann wahrscheinlich versuchen, das Keydown-Ereignis auf allen Tasten abzufangen, die einen Bildlauf auslösen können (Pfeile, Leerzeichen usw.), während Sie überprüfen, welches Element derzeit fokussiert ist, da Sie beispielsweise nicht mit scrollen können Pfeiltasten beim Eingeben eines Eingabefeldes. Im Allgemeinen wäre das ein komplexes und chaotisches Skript.
Abhängig von der Situation, mit der Sie es zu tun haben, könnte ich "die Logik zurücksetzen", und anstatt vom Benutzer ausgegebene Bildlaufereignisse zu erkennen, schließen Sie sich einfach an alle programmgesteuert erstellten Bildläufe an und behandeln Sie alle von Ihrem Code nicht erstellten Bildlaufereignisse wie von einem Benutzer erstellt. Wie ich schon sagte, es hängt von einer Situation ab und davon, was Sie erreichen wollen.
quelle
Anstatt zu versuchen, alle Benutzerereignisse zu erfassen, ist es viel einfacher, das Gegenteil zu tun und nur die programmatischen Ereignisse zu behandeln - und diese zu ignorieren.
Zum Beispiel würde diese Art von Code funktionieren:
Wenn Sie dann anrufen
setScrollTop()
, wird das Bildlaufereignis ignoriert. Wenn der Benutzer mit der Maus, der Tastatur oder auf andere Weise blättert, wird das Ereignis verarbeitet.quelle
Ja, das ist zu 100% möglich. Ich verwende dies derzeit in einer Anwendung, in der IE nicht erforderlich ist - nur für Kunden. Wenn meine Backbone-App eine Animation initiiert, bei der der Bildlauf geändert wird, wird ein Bildlauf ausgeführt, der diese Ereigniserfassungen jedoch nicht auslöst. Dies wird in FF, Safari & Chrome spätestens getestet.
quelle
Versuchen Sie stattdessen, die Ereignisse Mousewheel und DOMMouseScroll zu verwenden. Siehe http://www.quirksmode.org/dom/events/scroll.html
quelle
Sie können die Bildlaufposition auf Bereit überprüfen. Wenn Sie das Ereignis beim Scrollen auslösen, überprüfen Sie, ob die Bildlaufposition anders ist als beim Laden der Seite. Zuletzt müssen Sie den gespeicherten Wert löschen, sobald die Seite gescrollt ist.
quelle
Bezüglich:
Das wird sehr bald ausgelöst, nachdem die Seite gerendert wurde. Sie können das Listening des Bildlaufereignisses nur um ca. 1 Sekunde verzögern.
quelle
Es gibt noch eine weitere Möglichkeit, den vom Benutzer erstellten Bildlauf zu trennen: Sie können die alternativen Ereignishandler verwenden, z. B. "Mausrad", "Touchmove", "Keydown" mit den Codes 38 und 40 für das Scrollen mit Pfeilen und zum Scrollen mit Bildlaufleiste - wenn Das Ereignis 'scroll' wird gleichzeitig mit dem Ereignis 'mousedown' bis zum Ereignis 'mouseup' ausgelöst.
quelle
Es hilft möglicherweise nicht bei Ihrer Anwendung, aber ich musste ein Ereignis beim Scrollen des Benutzers auslösen, aber nicht beim programmgesteuerten Scrollen und Posten, falls es anderen hilft.
Hören Sie sich die
wheel
Veranstaltung stattscroll
,Es wird ausgelöst, wenn ein Benutzer das Mausrad oder das Tracker-Pad verwendet (was meiner Meinung nach die meisten Leute sowieso scrollen) und wird nicht ausgelöst, wenn Sie programmgesteuert scrollen. Ich habe es verwendet, um zwischen einer Benutzer-Bildlaufaktion und Bildlauffunktionen zu unterscheiden.
https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event
Eine Einschränkung ist, dass
wheel
beim Scrollen auf Mobilgeräten nicht ausgelöst wird. Daher habe ich überprüft, ob das Gerät mobil ist, und ähnliche Funktionen verwendetquelle
Fand das sehr nützlich. Hier ist eine Coffeescript-Version für diejenigen, die so geneigt sind.
quelle
Wenn Sie JQuery verwenden, gibt es anscheinend eine bessere Antwort - ich probiere es nur selbst aus.
Siehe: Jquery-Ereignisauslöser vom Benutzer erkennen oder per Code aufrufen
quelle