Ricevi eventi della rotellina del mouse in jQuery?


130

C'è un modo per ottenere gli eventi della rotellina del mouse (senza parlare di scrolleventi) in jQuery?


1
Una rapida ricerca ha rivelato questo plugin che potrebbe aiutare.
Jerad Rose,


@thejh pubblicato una nuova risposta su questo con eventi DOM3: stackoverflow.com/a/24707712/2256325
Sergio


Solo una nota su questo. Se desideri solo rilevare le modifiche a un input e non rileva le modifiche tramite la rotellina del mouse, prova$(el).on('input', ...
rybo111

Risposte:


46

C'è un plugin che rileva la rotellina del mouse su / giù e la velocità su una regione.


35
collegare? dai .. controlla la risposta qui sotto puoi farlo senza

201
$(document).ready(function(){
    $('#foo').bind('mousewheel', function(e){
        if(e.originalEvent.wheelDelta /120 > 0) {
            console.log('scrolling up !');
        }
        else{
            console.log('scrolling down !');
        }
    });
});

51
L' DOMMouseScrollevento viene utilizzato in FF, quindi devi ascoltare su entrambi .bind('DOMMouseScroll mousewheel') {evetns developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/…
mrzmyr

9
e.originalEvent.wheelDeltanon è definito in FF23
hofnarwillie

26
Non è necessario dividere per 120 è inutile spreco di CPU
Venimus,

6
deve essere stata la risposta migliore

2
Ma comunque, perché dovresti dividerlo per 120? Cos'è quella costante? (Non è necessario, come ha sottolineato
Venimus

145

Vincolante per entrambi mousewheele ha DOMMouseScrollfinito per funzionare davvero bene per me:

$(window).bind('mousewheel DOMMouseScroll', function(event){
    if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) {
        // scroll up
    }
    else {
        // scroll down
    }
});

Questo metodo funziona in IE9 +, Chrome 33 e Firefox 27.


Modifica - Mar 2016

Ho deciso di rivisitare questo problema da un po 'di tempo. La pagina MDN per l'evento scroll ha un ottimo modo per recuperare la posizione di scorrimento che utilizza requestAnimationFrame, che è altamente preferibile al mio precedente metodo di rilevamento. Ho modificato il loro codice per fornire una migliore compatibilità oltre alla direzione e posizione dello scorrimento:

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

Guarda la penna Vanilla JS Scroll Tracking di Jesse Dupuy ( @ blindside85 ) su CodePen .

Questo codice sta attualmente funzionando Chrome v50, Firefox v44, Safari v9, and IE9+

Riferimenti:


Questo ha funzionato al meglio per me. Tuttavia, questo script viene eseguito per "clic" della rotella di scorrimento. Questo può essere schiacciante per alcuni script da usare. Esiste un modo per trattare ogni evento di scorrimento come un'istanza, anziché eseguire lo script per clic della rotellina di scorrimento?
invoca

Non particolarmente. Da quello che ho visto, molte persone eviteranno di occuparsi del monitoraggio dello scorrimento o useranno invece un timer (ad esempio, controlla la posizione dell'utente sulla pagina ogni x millisecondi, ecc.). Se c'è una soluzione più performante là fuori, voglio assolutamente saperlo!
Jesse Dupuy,

1
Ho trovato un modo per farlo: stackoverflow.com/questions/23919035/...
invot

1
Grazie per l'aggiornamento. Puoi copiare il tuo codice nella tua risposta? Non so mai se un giorno il codepen potrebbe andare giù. È successo prima.
JDB ricorda ancora Monica il

2
@JesseDupuy, voterei a favore di questa risposta, ma la tua versione aggiornata non funziona se il documento si adatta alla vista ("larghezza: 100vh; altezza: 100vh") o ottiene "overflow: nascosto;". "window.addEventListener ('scroll', callback)" non è la risposta corretta a "window.addEventListener ('mousewheel', callback)".
Daniel,

45

A partire da ora nel 2017, puoi semplicemente scrivere

$(window).on('wheel', function(event){

  // deltaY obviously records vertical scroll, deltaX and deltaZ exist too
  if(event.originalEvent.deltaY < 0){
    // wheeled up
  }
  else {
    // wheeled down
  }
});

Funziona con l'attuale Firefox 51, Chrome 56, IE9 +


37

Le risposte che parlano dell'evento "rotellina del mouse" si riferiscono a un evento obsoleto. L'evento standard è semplicemente "ruota". Vedi https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel


20
Ho provato questi e ho trovato: "wheel" funziona su Firefox e IE ma non su Chrome. "mousewheel" funziona in Chrome e IE ma non in Firefox. "DOMMouseScroll" funziona solo in Firefox.
Curtis Yallop,

1
Whoa, questo mi ha fatto risparmiare un sacco di tempo. Grazie!
gustavohenke,

3
Sembra che Chrome abbia aggiunto il supporto per "wheel" nell'agosto 2013: code.google.com/p/chromium/issues/detail?id=227454
rstackhouse

2
Safari non supporta ancora l'evento ruota.
Thayne,

Come dice la tua documentazione, l' wheelevento è supportato su Edge non IEche non è la stessa cosa. CanIuse
Alex

16

Questo ha funzionato per me :)

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

da StackOverflow


14

Ecco una soluzione alla vaniglia. Può essere utilizzato in jQuery se l'evento passato alla funzione è event.originalEventquale jQuery rende disponibile come proprietà dell'evento jQuery. O se all'interno della callbackfunzione in aggiungiamo prima prima riga: event = event.originalEvent;.

Questo codice normalizza la velocità / quantità della ruota ed è positivo per quello che sarebbe uno scorrimento in avanti in un mouse tipico e negativo in un movimento della ruota del mouse all'indietro.

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

C'è anche un plugin per jQuery, che è più dettagliato nel codice e un po 'di zucchero extra: https://github.com/brandonaaron/jquery-mousewheel


8

Questo funziona in ogni versione di IE, Firefox e Chrome.

$(document).ready(function(){
        $('#whole').bind('DOMMouseScroll mousewheel', function(e){
            if(e.originalEvent.wheelDelta > 0 || e.originalEvent.detail < 0) {
                alert("up");
            }
            else{
                alert("down");
            }
        });
    });

5

Sono stato bloccato in questo problema oggi e ho scoperto che questo codice funziona bene per me

$('#content').on('mousewheel', function(event) {
    //console.log(event.deltaX, event.deltaY, event.deltaFactor);
    if(event.deltaY > 0) {
      console.log('scroll up');
    } else {
      console.log('scroll down');
    }
});

4

usa questo codice

 knob.bind('mousewheel', function(e){  
 if(e.originalEvent.wheelDelta < 0) {
    moveKnob('down');
  } else {
    moveKnob('up');
 }
  return false;
});

0

la mia combinazione è simile a questa. svanisce e si dissolve in ogni scorrimento verso il basso / verso l'alto. altrimenti devi scorrere fino all'intestazione, per far scomparire l'intestazione.

var header = $("#header");
$('#content-container').bind('mousewheel', function(e){
    if(e.originalEvent.wheelDelta > 0) {
        if (header.data('faded')) {
            header.data('faded', 0).stop(true).fadeTo(800, 1);
        }
    }
    else{
        if (!header.data('faded')) header.data('faded', 1).stop(true).fadeTo(800, 0);
    }
});

quello sopra non è ottimizzato per touch / mobile, penso che questo lo faccia meglio per tutti i dispositivi mobili:

var iScrollPos = 0;
var header = $("#header");
$('#content-container').scroll(function () {

    var iCurScrollPos = $(this).scrollTop();
    if (iCurScrollPos > iScrollPos) {
        if (!header.data('faded')) header.data('faded', 1).stop(true).fadeTo(800, 0);

    } else {
        //Scrolling Up
        if (header.data('faded')) {
            header.data('faded', 0).stop(true).fadeTo(800, 1);
        }
    }
    iScrollPos = iCurScrollPos;

});

0

Il plugin che ha pubblicato @DarinDimitrov jquery-mousewheel, è rotto con jQuery 3+ . Sarebbe più consigliabile utilizzare ciò jquery-wheelche funziona con jQuery 3+.

Se non si desidera seguire il percorso jQuery, MDN consiglia vivamente di utilizzare l' mousewheelevento poiché non è standard e non è supportato in molti punti. Dice invece che dovresti usare l' wheelevento poiché ottieni molta più specificità esattamente sul significato dei valori che stai ottenendo. È supportato dalla maggior parte dei browser principali.


0

Se si utilizza il plugin jwery mousewheel menzionato , allora che cosa si intende per utilizzare il secondo argomento della funzione del gestore eventi - delta:

$('#my-element').on('mousewheel', function(event, delta) {
    if(delta > 0) {
    console.log('scroll up');
    } 
    else {
    console.log('scroll down');
    }
});

-3

Recentemente ho avuto lo stesso problema dove $(window).mousewheelstava tornandoundefined

Quello che ho fatto è stato $(window).on('mousewheel', function() {});

Inoltre per elaborarlo sto usando:

function (event) {
    var direction = null,
        key;

    if (event.type === 'mousewheel') {
        if (yourFunctionForGetMouseWheelDirection(event) > 0) {
            direction = 'up';
        } else {
            direction = 'down';
        }
    }
}

Non hai detto che cosa ha newUtilities.getMouseWheelDirection
ccsakuweb

È fuori dalla portata di questa domanda. Quindi non è un sito Web copia incolla.
Szymon Toda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.