Получить события колесика мыши в jQuery?

Есть ли способ получить события колеса мыши (не говоря о событиях scroll) в jQuery?

Ответ 1

Там есть плагин, который определяет колесико мыши и скорость перемещения по области.

Ответ 2

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

Ответ 3

Связывание с mousewheel и DOMMouseScroll закончилось тем, что работало очень хорошо для меня:

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

Этот метод работает в IE9 +, Chrome 33 и Firefox 27.


Изменить - март 2016

Я решил пересмотреть этот вопрос, так как это было какое-то время. Страница MDN для события прокрутки имеет отличный способ поиска позиции прокрутки, которая использует requestAnimationFrame, что очень предпочтительно для моего предыдущего метода обнаружения. Я изменил их код, чтобы обеспечить лучшую совместимость в дополнение к направлению прокрутки и положению:

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

Ответ 5

Это сработало для меня:)

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

fooobar.com/questions/24962/...

Ответ 6

Вот ванильное решение. Может использоваться в jQuery, если событие, переданное функции, event.originalEvent, которое jQuery предоставляет как свойство события jQuery. Или, если внутри функции callback, которую мы добавляем перед первой строкой: event = event.originalEvent;.

Этот код нормализует скорость/количество колес и положителен для того, что было бы прямым прокруткой в ​​обычной мыши, и отрицательным в обратном движении колеса мыши.

Демо: 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);

Существует также плагин для jQuery, который является более подробным в коде и дополнительном сахаре: https://github.com/brandonaaron/jquery-mousewheel

Ответ 7

На данный момент в 2017 году вы можете просто написать

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

Работает с текущими Firefox 51, Chrome 56, IE9 +

Ответ 8

Это работает в каждой версии IE, Firefox и Chrome.

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

Ответ 9

Я застрял в этом выпуске сегодня и нашел, что этот код работает отлично для меня

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

Ответ 10

используйте этот код

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

Ответ 11

моя комбинация выглядит так. он исчезает и исчезает при каждом прокрутке вниз/вверх. в противном случае вам нужно прокрутить вверх до заголовка, чтобы затухать заголовок.

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

вышеупомянутый не оптимизирован для touch/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;

});

Ответ 12

Плагин, который опубликовал @DarinDimitrov, jquery-mousewheel, разбит на jQuery 3+. Было бы целесообразнее использовать jquery-wheel, который работает с jQuery 3 +.

Если вы не хотите идти по маршруту jQuery, MDN очень осторожно использует событие mousewheel, поскольку он нестандартен и не поддерживается в многие места. Вместо этого он говорит, что вы должны использовать событие wheel, поскольку вы получаете гораздо большую специфичность в отношении того, какие значения вы получаете. Он поддерживается большинством основных браузеров.

Ответ 13

Если вы используете упомянутый jquery mousewheel plugin, то как насчет использования 2-го аргумента функции обработчика событий - delta:

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

Ответ 14

Недавно у меня была такая же проблема, $(window).mousewheel возвращал undefined

То, что я сделал, было $(window).on('mousewheel', function() {});

В дополнение к обработке я использую:

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

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