Есть ли способ получить события колеса мыши (не говоря о событиях scroll
) в jQuery?
Получить события колесика мыши в 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;
});
})();
Ответ 4
Ответы о событии "mousewheel" относятся к устаревшему событию. Стандартное событие - просто "колесо". См. https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel
Ответ 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;
});
Ответ 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';
}
}
}