Nhận sự kiện bánh xe chuột trong jQuery?


130

Có cách nào để có được các sự kiện bánh xe chuột (không nói về scrollcác sự kiện) trong jQuery không?


1
Một tìm kiếm nhanh chóng bật lên plugin này có thể giúp đỡ.
Jerad Rose

Giải pháp này hiệu quả với tôi: stackoverflow.com/questions/7154967/jquery-detect-scrolldown
bertie

@thejh đã đăng câu trả lời mới về vấn đề này với các sự kiện DOM3: stackoverflow.com/a/24707712/2256325
Sergio

Phát hiện có thể trùng lặp cuộn jQuery () khi người dùng dừng cuộn
divy3993

Chỉ cần một lưu ý về điều này. Nếu bạn chỉ muốn phát hiện các thay đổi đối với đầu vào và nó không phát hiện các thay đổi thông qua bánh xe chuột, hãy thử$(el).on('input', ...
rybo111

Câu trả lời:



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
Các DOMMouseScrollsự 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/...
mrzmyr

9
e.originalEvent.wheelDeltakhông được xác định trong FF23
hofnarwillie

26
Bạn không cần chia cho 120, đó là sự lãng phí vô ích của cpu
venimus

6
phải có câu trả lời đúng nhất

2
Nhưng dù sao, tại sao bạn muốn chia nó cho 120? Cái gì mà không đổi? (Bạn không cần phải, như venimus đã chỉ ra.)
mshthn

145

Liên kết với cả hai mousewheelDOMMouseScrollcuố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;
  });
})();

Xem Theo dõi cuộn Pen Vanilla JS của Jesse Dupuy ( @ blindside85 ) trên CodePen .

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:


Điều này làm việc tốt nhất cho tôi. Tuy nhiên, tập lệnh này chạy trên mỗi lần "nhấp" của bánh xe cuộn. Điều này có thể áp đảo cho một số tập lệnh sử dụng. Có cách nào để coi mỗi sự kiện cuộn là một ví dụ, thay vì chạy tập lệnh cho mỗi lần nhấp vào bánh xe cuộn không?
mời

Không có gì đặc biệt. Từ những gì tôi đã thấy, nhiều người sẽ tránh phải đối phó với theo dõi cuộn hoặc thay vào đó họ sẽ sử dụng đồng hồ bấm giờ (ví dụ: kiểm tra vị trí của người dùng trên trang mỗi x mili giây, v.v.). Nếu có một giải pháp hiệu quả hơn ngoài kia, tôi chắc chắn muốn biết về nó!
Jesse Dupuy

1
Tôi đã tìm thấy một cách để làm điều này: stackoverflow.com/questions/23919035/ cấp
invot

1
Cảm ơn các cập nhật. Bạn có thể sao chép mã của bạn vào câu trả lời của bạn? Không bao giờ biết nếu codepen có thể đi xuống một ngày nào đó. Nó đã xảy ra trước đây.
JDB vẫn còn nhớ Monica

2
@JesseDupuy, tôi sẽ đưa ra câu trả lời này, nhưng phiên bản cập nhật của bạn không hoạt động nếu tài liệu phù hợp với chế độ xem ("width: 100vh; height: 100vh") hoặc có "overflow: hidden;". "window.addEventListener ('scroll', gọi lại)" không phải là câu trả lời đúng cho "window.addEventListener ('mousewheel', gọi lại)".
Daniel

45

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


37

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


20
Tôi đã thử những thứ này và thấy: "wheel" hoạt động trong Firefox và IE nhưng không phải Chrome. "mousewheel" hoạt động trong Chrome và IE nhưng không phải Firefox. "DOMMouseScroll" chỉ hoạt động trong Firefox.
Curtis Yallop

1
Whoa, điều này giúp tôi tiết kiệm rất nhiều thời gian. Cảm ơn!
gustavohenke

3
Có vẻ như Chrome đã thêm hỗ trợ cho "bánh xe" vào tháng 8 năm 2013: code.google.com/p/chromium/issues/detail?id=227454
rstackhouse

2
Safari vẫn không hỗ trợ sự kiện bánh xe.
Thayne

Như tài liệu của bạn nói, wheelsự kiện được hỗ trợ Edge không phải IElà điều tương tự. CanIuse
Alex

16

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

từ stackoverflow


14

Đâ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.originalEventjQuery cung cấp dưới dạng thuộc tính của sự kiện jQuery. Hoặc nếu bên trong callbackhà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.

Bản trình diễn: 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);

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


8

Điều này đang hoạt động trong mỗi phiên bản mới nhất của IE, Firefox và 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

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

4

sử dụng mã này

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

0

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;

});

0

Các plugin @DarinDimitrov đăng, jquery-mousewheel, được chia với jQuery 3+ . Sẽ tốt hơn nếu sử dụng jquery-wheelcá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 wheelsự 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.


0

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

-3

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

Bạn đã không nói những gì có newUtilities.getMouseWheelDirection
ccsakuweb

Nó nằm ngoài phạm vi của câu hỏi này. Vì nó không sao chép trang web dán.
Szymon Toda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.