Obtenir des événements de roue de souris en jQuery?

y a-t-il un moyen d'obtenir les évènements de la roue de la souris (ne pas parler des évènements scroll ) dans jQuery?

110
demandé sur Sergio 2011-11-19 02:16:31

14 réponses

Il ya un plugin qui détecte haut/bas la roue de la souris et la vitesse sur une région.

46
répondu Darin Dimitrov 2013-06-28 14:49:38
​$(document).ready(function(){
    $('#foo').bind('mousewheel', function(e){
        if(e.originalEvent.wheelDelta /120 > 0) {
            console.log('scrolling up !');
        }
        else{
            console.log('scrolling down !');
        }
    });
});
174
répondu mahdi shahbazi 2017-08-19 20:57:13

liant à la fois mousewheel et DOMMouseScroll a fini par fonctionner vraiment bien pour moi:

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

cette méthode fonctionne dans IE9+, Chrome 33, et Firefox 27.


Edit-Mars 2016

j'ai décidé de revenir sur cette question depuis longtemps. La page MDN pour l'événement de défilement a une grande façon de récupérer la position de défilement qui fait usage de requestAnimationFrame , ce qui est hautement préférable à ma méthode de détection précédente. J'ai modifié leur code afin de fournir une meilleure compatibilité en outre à la direction de défilement et de la position:

(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;
  });
})();
Voir le stylo Vanilla js Scroll Tracking de Jesse Dupuy ( @blindside85 ) sur CodePen .

ce code fonctionne actuellement dans Chrome v50, Firefox v44, Safari v9, and IE9+

, les Références:

139
répondu Jesse Dupuy 2016-11-13 22:56:20

les réponses parlant de l'événement" mousewheel " font référence à un événement déprécié. L'événement standard est simplement "la roue". Voir https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel

35
répondu Brian Di Palma 2013-08-12 14:29:01

à partir de maintenant en 2017, vous pouvez juste écrire

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

fonctionne avec Firefox 51, Chrome 56, IE9+

22
répondu Louis Ameline 2017-02-05 23:25:45

cela a fonctionné pour moi:)

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

de stackoverflow

15
répondu Anjith K P 2017-05-23 10:31:35

Voici une solution à la vanille. Peut être utilisé dans jQuery si l'événement passé à la fonction est event.originalEvent que jQuery met à disposition en tant que propriété de l'événement jQuery. Ou si à l'intérieur de la fonction callback nous ajoutons avant la première ligne: event = event.originalEvent; .

ce code normalise la vitesse/quantité de la roue et est positif pour ce qui serait un défilement vers l'avant dans une souris typique, et négatif dans un mouvement de la roue arrière de la souris.

Démo

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

il y a aussi un plugin pour jQuery, qui est plus verbeux dans le code et un peu de sucre supplémentaire: https://github.com/brandonaaron/jquery-mousewheel

14
répondu Sergio 2014-07-11 22:45:02

cela fonctionne dans les dernières versions de chaque IE, Firefox et Chrome.

$(document).ready(function(){
        $('#whole').bind('DOMMouseScroll mousewheel', function(e){
            if(e.originalEvent.wheelDelta > 0 || e.originalEvent.detail < 0) {
                alert("up");
            }
            else{
                alert("down");
            }
        });
    });
8
répondu futuredayv 2015-09-09 08:37:25

j'étais coincé dans ce numéro aujourd'hui et j'ai trouvé ce code fonctionne très bien pour moi

$('#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
répondu Prafull Sharma 2016-06-24 19:40:47

utilisez ce code

 knob.bind('mousewheel', function(e){  
 if(e.originalEvent.wheelDelta < 0) {
    moveKnob('down');
  } else {
    moveKnob('up');
 }
  return false;
});
3
répondu Bal mukund kumar 2017-04-26 08:28:19

ma combinaison ressemble à ça. elle s'efface et s'efface sur chaque rouleau. sinon, vous devez faire défiler jusqu'à l'en-tête, pour la décoloration de l'en-tête.

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

celui ci-dessus n'est pas optimisé pour touch / mobile, je pense que celui-ci le fait mieux pour tout mobile:

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
répondu Thomas Hartmann 2014-06-18 13:32:54

le plugin que @DarinDimitrov a posté, jquery-mousewheel , est cassé avec jQuery 3+ . Il serait préférable d'utiliser jquery-wheel qui fonctionne avec jQuery 3+.

si vous ne voulez pas suivre la route de jQuery, MDN met fortement en garde en utilisant le mousewheel événement comme il est non standard et non supporté dans de nombreux endroits. Il dit plutôt que vous devriez utiliser l'événement wheel comme vous obtenez beaucoup plus de spécificité sur exactement ce que les valeurs que vous obtenez signifie. Il est pris en charge par la plupart des principaux navigateurs.

0
répondu Coburn 2016-11-03 18:05:12

si l'utilisation mentionnée jQuery mousewheel plugin , alors que faire pour utiliser le 2ème argument de la fonction de handler d'événement - delta :

$('#my-element').on('mousewheel', function(event, delta) {
    if(delta > 0) {
    console.log('scroll up');
    } 
    else {
    console.log('scroll down');
    }
});
0
répondu Mojo 2017-04-18 09:31:56

j'ai eu le même problème récemment, où $(window).mousewheel revenait undefined

ce que j'ai fait était $(window).on('mousewheel', function() {});

pour le traiter, J'utilise:

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

    if (event.type === 'mousewheel') {
        if (yourFunctionForGetMouseWheelDirection(event) > 0) {
            direction = 'up';
        } else {
            direction = 'down';
        }
    }
}
-3
répondu Szymon Toda 2014-07-01 07:48:04