Отримати події з колесом миші в jQuery?


130

Чи є спосіб отримати події колеса миші (не кажучи про scrollподії) в jQuery?


1
Швидкий пошук знайшов цей плагін, який може допомогти.
Джерад Роуз

Це рішення працює для мене: stackoverflow.com/questions/7154967/jquery-detect-scrolldown
Берті

@thejh опублікував новий відповідь на це з подіями DOM3: stackoverflow.com/a/24707712/2256325
Sergio


Просто записка з цього приводу. Якщо ви просто хочете виявити зміни на вході, а він не виявляє зміни за допомогою колеса миші, спробуйте$(el).on('input', ...
rybo111

Відповіді:


46

Існує плагін, який виявляє колесо миші вгору / вниз та швидкість руху в регіоні.


35
підключати? давай .. перевіри відповідь нижче, ти можеш це зробити без

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
DOMMouseScrollПодія використовується в FF, так що ви повинні слухати на обох .bind('DOMMouseScroll mousewheel') {evetns developer.mozilla.org/en-US/docs/DOM/DOM_event_reference / ...
mrzmyr

9
e.originalEvent.wheelDeltaне визначено у FF23
hofnarwillie

26
Вам не потрібно ділити на 120, це марно витрачати процесор
venimus

6
мабуть, найкраща відповідь

2
Але в будь-якому випадку, чому ви хочете поділити його на 120? Що це за постій? (Вам не потрібно, як вказував venimus.)
mshthn

145

Зв'язавшись із обома 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;
  });
})();

Див. Відстеження прокрутки Pen Vanilla JS від Jesse Dupuy ( @ blindside85 ) на CodePen .

Зараз цей код працює Chrome v50, Firefox v44, Safari v9, and IE9+

Список літератури:


Це працювало найкраще для мене. Однак цей сценарій працює за "клік" колеса прокрутки. Це може бути переважним для використання у деяких сценаріях. Чи є спосіб розглянути кожну подію прокрутки як один екземпляр, замість того, щоб запускати сценарій за кожним клацанням колеса прокрутки?
інвот

Не особливо. З того, що я бачив, багато людей або уникатимуть справи з відстеженням прокрутки, або замість цього використовуватимуть таймер (наприклад, перевіряють положення користувача на сторінці кожні х мілісекунд тощо). Якщо там є більш ефективне рішення, я точно хочу знати про це!
Джессі Дюпюй

1
Я знайшов спосіб зробити це: stackoverflow.com/questions/23919035 / ...
invot

1
Дякуємо за оновлення. Чи можете ви скопіювати код у відповідь? Ніколи не знаю, чи кодек може колись знизитися. Це було раніше.
JDB досі пам’ятає Моніку

2
@JesseDupuy, я б схвалив цю відповідь, але ваша оновлена ​​версія не працює, якщо документ відповідає виду ("ширина: 100vh; висота: 100vh") або отримав "overflow: hidden;". "window.addEventListener (" прокрутка ", зворотний дзвінок)" не є правильною відповіддю на "window.addEventListener (" миші ", зворотній зв'язок)".
Даніель

45

Станом на 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 +


37

Відповіді, що говорять про подію "мишоловка", відносяться до застарілої події. Стандартний захід - просто "колесо". Дивіться https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel


20
Я спробував це і виявив: "колесо" працює в Firefox та IE, але не в Chrome. "mousewheel" працює в Chrome та IE, але не у Firefox. "DOMMouseScroll" працює лише у Firefox.
Кертіс Яллоп

1
Ого, це врятувало мені багато часу. Дякую!
gustavohenke

3
Схоже, Chrome додав підтримку "колеса" у серпні 2013 року: code.google.com/p/chromium/isissue/detail?id=227454
rstackhouse

2
Safari досі не підтримує подію на колесах.
Thayne

Як говориться у вашій документації, wheelподія підтримується Edge не на тому, IEщо це не те саме. CanIuse
Алекс

16

Це працювало для мене :)

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

від stackoverflow


14

Ось розчин ванілі. Може використовуватися в 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


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

5

Я сьогодні застряг у цьому випуску і виявив, що цей код працює для мене чудово

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

використовувати цей код

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

0

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

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

вищеописаний не оптимізований для сенсорного / мобільного, я думаю, що це робить це краще для всіх мобільних:

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

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

Якщо ви не хочете йти маршрутом jQuery, MDN дуже застерігає, використовуючи mousewheelподію, оскільки вона нестандартна і не підтримується в багатьох місцях. Натомість це говорить про те, що ви повинні використовувати wheelподію, оскільки ви отримуєте набагато більше конкретики щодо того, що саме означають значення, які ви отримуєте. Його підтримують більшість основних браузерів.


0

Якщо ви використовуєте згаданий плагін jwery mousewheel , то що робити з використанням 2-го аргументу функції обробника подій - delta:

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

-3

Таку ж проблему я нещодавно $(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';
        }
    }
}

Ви не сказали, що має newUtilities.getMouseWheelDirection
ccsakuweb

Це поза цим питанням. Так це не копіювати вставити веб-сайт.
Szymon Toda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.