Есть ли способ получить события колеса мыши (не говоря уже о scroll
событиях) в jQuery?
$(el).on('input', ...
Есть ли способ получить события колеса мыши (не говоря уже о scroll
событиях) в jQuery?
$(el).on('input', ...
Ответы:
Есть плагин, который определяет движение колесика мыши вверх / вниз и скорость в регионе.
$(document).ready(function(){
$('#foo').bind('mousewheel', function(e){
if(e.originalEvent.wheelDelta /120 > 0) {
console.log('scrolling up !');
}
else{
console.log('scrolling down !');
}
});
});
DOMMouseScroll
Событие используется в FF, так что вы должны слушать на обоих .bind('DOMMouseScroll mousewheel') {
evetns developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/...
e.originalEvent.wheelDelta
не определено в FF23
Привязка к обоим 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;
});
})();
Этот код в настоящее время работает в Chrome v50, Firefox v44, Safari v9, and IE9+
Ссылки:
На данный момент в 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 +
Ответы, говорящие о событии "колесико мыши", относятся к устаревшему событию. Стандартное мероприятие - это просто «колесо». См. Https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel
Это сработало для меня :)
//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;
.
Этот код нормализует скорость / величину колеса и положителен для прокрутки вперед в типичной мыши и отрицателен при движении колеса мыши назад.
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 mousewheel , то как насчет использования 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';
}
}
}