Gibt es eine Möglichkeit, die Mausrad-Ereignisse (nicht die Rede von scroll
Ereignisse) in jQuery?
Mausrad-Ereignisse in jQuery abrufen?
diejh
Mahdi Shahbazi
$(document).ready(function(){
$('#foo').bind('mousewheel', function(e){
if(e.originalEvent.wheelDelta /120 > 0) {
console.log('scrolling up !');
}
else{
console.log('scrolling down !');
}
});
});
-
Der
DOMMouseScroll
event wird in FF verwendet, also müssen Sie auf beide hören.bind('DOMMouseScroll mousewheel') {
ereignisse developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/…– e382df99a7950919789725ceeec126
7. April 13 um 10:26 Uhr
-
e.originalEvent.wheelDelta
ist in FF23 undefiniert– Hofnarwillie
10. September 13 um 10:44 Uhr
-
Sie müssen nicht durch 120 teilen, das ist nutzlose CPU-Verschwendung
– Gift
30. September 13 um 11:21 Uhr
-
muss die beste Antwort gewesen sein
– Benutzer2869113
13. Oktober 13 um 15:43 Uhr
-
Aber wieso willst du es durch 120 teilen? Was ist das für eine Konstante? (Sie müssen nicht, wie Venimus betonte.)
– mshthn
4. Oktober 15 um 20:44 Uhr
Jesse Dupuy
Bindung an beide mousewheel
und DOMMouseScroll
hat bei mir am Ende sehr gut funktioniert:
$(window).bind('mousewheel DOMMouseScroll', function(event){
if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) {
// scroll up
}
else {
// scroll down
}
});
Diese Methode funktioniert in IE9+, Chrome 33 und Firefox 27.
Bearbeiten – März 2016
Ich habe mich entschieden, dieses Thema erneut zu behandeln, da es eine Weile her ist. Die MDN-Seite für das Scroll-Ereignis bietet eine großartige Möglichkeit, die verwendete Scroll-Position abzurufen requestAnimationFrame
, was meiner vorherigen Erkennungsmethode sehr vorzuziehen ist. Ich habe ihren Code geändert, um neben der Bildlaufrichtung und -position eine bessere Kompatibilität zu gewährleisten:
(function() {
var supportOffset = window.pageYOffset !== undefined,
lastKnownPos = 0,
ticking = false,
scrollDir,
currYPos;
function doSomething(scrollPos, scrollDir) {
// Your code goes here...
console.log('scroll pos: ' + scrollPos + ' | scroll dir: ' + scrollDir);
}
window.addEventListener('wheel', function(e) {
currYPos = supportOffset ? window.pageYOffset : document.body.scrollTop;
scrollDir = lastKnownPos > currYPos ? 'up' : 'down';
lastKnownPos = currYPos;
if (!ticking) {
window.requestAnimationFrame(function() {
doSomething(lastKnownPos, scrollDir);
ticking = false;
});
}
ticking = true;
});
})();
Siehe den Stift Vanilla JS Scroll-Tracking von Jesse Dupuy (@blindside85) an CodePen.
Dieser Code arbeitet derzeit in Chrome v50, Firefox v44, Safari v9, and IE9+
Verweise:
-
Das hat bei mir am besten funktioniert. Allerdings läuft dieses Skript per „Klick“ des Scrollrads. Dies kann für einige Skripte überwältigend sein. Gibt es eine Möglichkeit, jedes Scroll-Ereignis als eine Instanz zu behandeln, anstatt das Skript pro Scrollrad-Klick auszuführen?
– einladen
28. Mai ’14 um 17:15 Uhr
-
Nicht speziell. Nach dem, was ich gesehen habe, werden viele Leute es entweder vermeiden, sich mit Scroll-Tracking zu befassen, oder sie verwenden stattdessen einen Timer (z. B. überprüfen Sie die Position des Benutzers auf der Seite alle x Millisekunden usw.). Wenn es da draußen eine leistungsfähigere Lösung gibt, möchte ich unbedingt davon erfahren!
– Jesse Dupuy
7. August 14 um 23:48 Uhr
-
Ich habe einen Weg gefunden, dies zu tun: stackoverflow.com/questions/23919035/…
– einladen
7. August 14 um 23:58 Uhr
-
Danke für das Update. Können Sie Ihren Code in Ihre Antwort kopieren? Man weiß nie, ob Codepen eines Tages untergeht. Es ist schon einmal passiert.
– JDB
23. April 16 um 15:15 Uhr
-
@JesseDupuy, ich würde diese Antwort positiv bewerten, aber Ihre aktualisierte Version funktioniert nicht, wenn das Dokument in die Ansicht passt (“Breite: 100 vh; Höhe: 100 vh”) oder “Überlauf: versteckt;” hat. “window.addEventListener(‘scroll’, callback)” ist nicht die richtige Antwort auf “window.addEventListener(‘mousewheel’, callback)”.
– Daniel
6. Mai 16 um 9:52 Uhr
Louis Ameline
Ab jetzt im Jahr 2017 können Sie nur noch schreiben
$(window).on('wheel', function(event){
// deltaY obviously records vertical scroll, deltaX and deltaZ exist too.
// this condition makes sure it's vertical scrolling that happened
if(event.originalEvent.deltaY !== 0){
if(event.originalEvent.deltaY < 0){
// wheeled up
}
else {
// wheeled down
}
}
});
Funktioniert mit aktuellem Firefox 51, Chrome 56, IE9+
-
Diese Antwort funktioniert besser als alle anderen!
– VDWWD
15. April 21 um 20:30 Uhr
-
event.originalEvent.deltaY
kann beim horizontalen Scrollen 0 sein (gerade in meinem Laptop ausprobiert), also möchten Sie wahrscheinlich ifx<0
sonst wennx>0
.– ajax333221
29. Mai 21 um 20:01 Uhr
Darin Dimitrow
Da ist ein Plugin die das Aufwärts-/Abwärts-Mausrad und die Geschwindigkeit über einem Bereich erkennt.
Antworten, die über das Ereignis “Mausrad” sprechen, beziehen sich auf ein veraltetes Ereignis. Das Standardereignis ist einfach “Rad”. Sehen https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel
-
Ich habe diese ausprobiert und festgestellt: “Wheel” funktioniert in Firefox und IE, aber nicht in Chrome. “Mausrad” funktioniert in Chrome und IE, aber nicht in Firefox. “DOMMouseScroll” funktioniert nur in Firefox.
– Curtis Yallop
22. August 13 um 20:39 Uhr
-
Wow, das hat mir viel Zeit gespart. Danke!
– gustavohenke
20. November 13 um 17:17 Uhr
-
Sieht so aus, als hätte Chrome im August 2013 Unterstützung für „Wheel“ hinzugefügt: code.google.com/p/chromium/issues/detail?id=227454
– Stapelhaus
7. Juli 14 um 14:11 Uhr
-
Safari unterstützt das Radereignis immer noch nicht.
– Thayne
11. September 14 um 16:11 Uhr
-
Wie Ihre Dokumentation sagt,
wheel
Ereignis wird unterstützt aufEdge
nichtIE
was nicht dasselbe ist. Kann ich benutzen– Alex
6. März 18 um 7:16 Uhr
Gemeinschaft
Das hat bei mir funktioniert 🙂
//Firefox
$('#elem').bind('DOMMouseScroll', function(e){
if(e.originalEvent.detail > 0) {
//scroll down
console.log('Down');
}else {
//scroll up
console.log('Up');
}
//prevent page fom scrolling
return false;
});
//IE, Opera, Safari
$('#elem').bind('mousewheel', function(e){
if(e.originalEvent.wheelDelta < 0) {
//scroll down
console.log('Down');
}else {
//scroll up
console.log('Up');
}
//prevent page fom scrolling
return false;
});
vom Stapelüberlauf
-
Ich habe diese ausprobiert und festgestellt: “Wheel” funktioniert in Firefox und IE, aber nicht in Chrome. “Mausrad” funktioniert in Chrome und IE, aber nicht in Firefox. “DOMMouseScroll” funktioniert nur in Firefox.
– Curtis Yallop
22. August 13 um 20:39 Uhr
-
Wow, das hat mir viel Zeit gespart. Danke!
– gustavohenke
20. November 13 um 17:17 Uhr
-
Sieht so aus, als hätte Chrome im August 2013 Unterstützung für „Wheel“ hinzugefügt: code.google.com/p/chromium/issues/detail?id=227454
– Stapelhaus
7. Juli 14 um 14:11 Uhr
-
Safari unterstützt das Radereignis immer noch nicht.
– Thayne
11. September 14 um 16:11 Uhr
-
Wie Ihre Dokumentation sagt,
wheel
Ereignis wird unterstützt aufEdge
nichtIE
was nicht dasselbe ist. Kann ich benutzen– Alex
6. März 18 um 7:16 Uhr
Gemeinschaft
Hier ist eine Vanille-Lösung. Kann in jQuery verwendet werden, wenn das Ereignis an die Funktion übergeben wird event.originalEvent
die jQuery als Property des jQuery-Events zur Verfügung stellt. Oder wenn innerhalb der callback
Funktion unter fügen wir vor der ersten Zeile hinzu: event = event.originalEvent;
.
Dieser Code normalisiert die Radgeschwindigkeit/Menge und ist positiv für das, was bei einer typischen Maus ein Vorwärtsscrollen wäre, und negativ bei einer Rückwärtsbewegung des Mausrads.
Demo: http://jsfiddle.net/BXhzD/
var wheel = document.getElementById('wheel');
function report(ammout) {
wheel.innerHTML = 'wheel ammout: ' + ammout;
}
function callback(event) {
var normalized;
if (event.wheelDelta) {
normalized = (event.wheelDelta % 120 - 0) == -0 ? event.wheelDelta / 120 : event.wheelDelta / 12;
} else {
var rawAmmount = event.deltaY ? event.deltaY : event.detail;
normalized = -(rawAmmount % 3 ? rawAmmount * 10 : rawAmmount / 3);
}
report(normalized);
}
var event="onwheel" in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll';
window.addEventListener(event, callback);
Es gibt auch ein Plugin für jQuery, das ausführlicher im Code und etwas mehr Zucker ist: https://github.com/brandonaaron/jquery-mousewheel
.
Eine schnelle Suche ergab dieses Plugin das kann helfen.
– Jerad Rose
18. November 11 um 22:20 Uhr
Diese Lösung funktioniert für mich: stackoverflow.com/questions/7154967/jquery-detect-scrolldown
– Albert Gan
6. März 14 um 12:07 Uhr
@thejh hat dazu eine neue Antwort mit DOM3-Ereignissen gepostet: stackoverflow.com/a/24707712/2256325
– Sergio
14. Juli 14 um 13:00 Uhr
Mögliches Duplikat von jQuery scroll() erkennt, wenn der Benutzer aufhört zu scrollen
– divy3993
2. Februar 17 um 3:33 Uhr
Nur eine Anmerkung dazu. Wenn Sie nur Änderungen an einer Eingabe erkennen möchten und Änderungen über das Mausrad nicht erkannt werden, versuchen Sie es
$(el).on('input', ...
– rybo111
24. Juni 18 um 9:54 Uhr