Получить события колеса мыши в jQuery?
есть ли способ получить события колеса мыши (не говоря уже о scroll
события) в jQuery?
14 ответов:
здесь плагин который обнаруживает вверх / вниз колесо мыши и скорость над регионом.
$(document).ready(function(){ $('#foo').bind('mousewheel', function(e){ if(e.originalEvent.wheelDelta /120 > 0) { console.log('scrolling up !'); } else{ console.log('scrolling down !'); } }); });
привязка к обоим
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.
Edit-Mar 2016
я решил вернуться к этому вопросу, так как это было некоторое время. Страница MDN для события прокрутки имеет отличный способ получения позиции прокрутки, которая использует
requestAnimationFrame
, что очень предпочтительно для моего предыдущего метода обнаружения. Я изменил их код для обеспечения лучшей совместимости в дополнение к направлению прокрутки и позиции:Смотрите ручку отслеживание прокрутки Vanilla JS Джесси дупу (@blindside85) на CodePen.(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; }); })();
этот код в настоящее время работает в
Chrome v50, Firefox v44, Safari v9, and IE9+
ссылки:
ответы, говорящие о событии" mousewheel", ссылаются на устаревшее событие. Стандартное событие-это просто "колесо". См.https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel
на данный момент в 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+
это сработало для меня:)
//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; });
вот ванильное решение. Может использоваться в 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
это работает в каждой 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"); } }); });
Я застрял в этой проблеме сегодня и нашел этот код работает нормально для меня
$('#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'); } });
используйте этот код
knob.bind('mousewheel', function(e){ if(e.originalEvent.wheelDelta < 0) { moveKnob('down'); } else { moveKnob('up'); } return false; });
моя комбинация выглядит так. он исчезает и исчезает при каждом прокрутке вниз / вверх. в противном случае вы должны прокрутить до заголовка, для затухания заголовка В.
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; });
плагин ,который @ DarinDimitrov опубликовал,
jquery-mousewheel
, разрывается с jQuery 3+. Было бы более целесообразно использоватьjquery-wheel
, который работает с jQuery 3+.если вы не хотите идти по маршруту jQuery,MDN очень предостерегает с помощью
mousewheel
событие как это нестандарт и не поддерживается во многих местах. Вместо этого он говорит, что вы должны использоватьwheel
событие как вы получите гораздо больше конкретики по поводу того, что именно значения ты становишься злым. Он поддерживается большинством основных браузеров.
при использовании указанных колесико мыши в jQuery плагин, тогда как насчет использования 2-го аргумента функции обработчика событий -
delta
:$('#my-element').on('mousewheel', function(event, delta) { if(delta > 0) { console.log('scroll up'); } else { console.log('scroll down'); } });
недавно у меня была такая же проблема, где
$(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'; } } }