Có cách nào để có được các sự kiện bánh xe chuột (không nói về scroll
các sự kiện) trong jQuery không?
$(el).on('input', ...
Có cách nào để có được các sự kiện bánh xe chuột (không nói về scroll
các sự kiện) trong jQuery không?
$(el).on('input', ...
Câu trả lời:
Có một plugin phát hiện lên / xuống bánh xe chuột và vận tốc trên một vùng.
$(document).ready(function(){
$('#foo').bind('mousewheel', function(e){
if(e.originalEvent.wheelDelta /120 > 0) {
console.log('scrolling up !');
}
else{
console.log('scrolling down !');
}
});
});
DOMMouseScroll
sự kiện được sử dụng trong FF, vì vậy bạn phải lắng nghe trên cả hai .bind('DOMMouseScroll mousewheel') {
evetns developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/...
e.originalEvent.wheelDelta
không được xác định trong FF23
Liên kết với cả hai mousewheel
và DOMMouseScroll
cuối cùng làm việc rất tốt cho tôi:
$(window).bind('mousewheel DOMMouseScroll', function(event){
if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) {
// scroll up
}
else {
// scroll down
}
});
Phương pháp này đang hoạt động trong IE9 +, Chrome 33 và Firefox 27.
Chỉnh sửa - Tháng 3 năm 2016
Tôi quyết định xem xét lại vấn đề này vì đã được một thời gian. Trang MDN cho sự kiện cuộn có một cách tuyệt vời để truy xuất vị trí cuộn sử dụng requestAnimationFrame
, rất thích hợp với phương pháp phát hiện trước đây của tôi. Tôi đã sửa đổi mã của họ để cung cấp khả năng tương thích tốt hơn ngoài hướng và vị trí cuộn:
(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;
});
})();
Mã này hiện đang làm việc trong Chrome v50, Firefox v44, Safari v9, and IE9+
Người giới thiệu:
Kể từ bây giờ trong năm 2017, bạn chỉ có thể viết
$(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
}
});
Hoạt động với Firefox 51, Chrome 56, IE9 + hiện tại
Câu trả lời nói về sự kiện "mousewheel" đang đề cập đến một sự kiện không được chấp nhận. Sự kiện tiêu chuẩn chỉ đơn giản là "bánh xe". Xem https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel
Điều này làm việc cho tôi :)
//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;
});
Đây là một giải pháp vani. Có thể được sử dụng trong jQuery nếu sự kiện được truyền cho hàm là event.originalEvent
jQuery cung cấp dưới dạng thuộc tính của sự kiện jQuery. Hoặc nếu bên trong callback
hàm bên dưới chúng ta thêm vào trước dòng đầu tiên:event = event.originalEvent;
.
Mã này bình thường hóa tốc độ / số lượng bánh xe và dương cho những gì sẽ là một cuộn về phía trước trong một con chuột thông thường và tiêu cực trong một chuyển động bánh xe chuột lùi.
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);
Ngoài ra còn có một plugin cho jQuery, mã dài hơn trong mã và thêm một chút đường: https://github.com/brandonaaron/jquery-mousewheel
Tôi đã bị mắc kẹt trong vấn đề này ngày hôm nay và thấy mã này đang hoạt động tốt với tôi
$('#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');
}
});
sử dụng mã này
knob.bind('mousewheel', function(e){
if(e.originalEvent.wheelDelta < 0) {
moveKnob('down');
} else {
moveKnob('up');
}
return false;
});
sự kết hợp của tôi trông như thế này. nó mờ dần và mờ dần trong mỗi lần cuộn xuống / lên. nếu không, bạn phải cuộn lên tiêu đề, để làm mờ tiêu đề trong.
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);
}
});
cái trên không được tối ưu hóa cho cảm ứng / di động, tôi nghĩ cái này làm tốt hơn cho tất cả các thiết bị di động:
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;
});
Các plugin @DarinDimitrov đăng, jquery-mousewheel
, được chia với jQuery 3+ . Sẽ tốt hơn nếu sử dụng jquery-wheel
cái nào hoạt động với jQuery 3+.
Nếu bạn không muốn đi theo tuyến jQuery, MDN rất thận trọng khi sử dụngmousewheel
sự kiện này vì nó không chuẩn và không được hỗ trợ ở nhiều nơi. Nó thay vào đó nói rằng bạn nên sử dụng wheel
sự kiện khi bạn nhận được tính cụ thể hơn nhiều so với chính xác những giá trị bạn đang có ý nghĩa. Nó được hỗ trợ bởi hầu hết các trình duyệt chính.
Nếu sử dụng plugin jugery mousewheel đã đề cập , vậy còn sử dụng đối số thứ 2 của hàm xử lý sự kiện - delta
:
$('#my-element').on('mousewheel', function(event, delta) {
if(delta > 0) {
console.log('scroll up');
}
else {
console.log('scroll down');
}
});
Tôi có cùng một vấn đề thời gian gần đây mà
$(window).mousewheel
đã trởundefined
Những gì tôi đã làm là $(window).on('mousewheel', function() {});
Hơn nữa để xử lý nó tôi đang sử dụng:
function (event) {
var direction = null,
key;
if (event.type === 'mousewheel') {
if (yourFunctionForGetMouseWheelDirection(event) > 0) {
direction = 'up';
} else {
direction = 'down';
}
}
}