Phát hiện nếu người dùng đang cuộn


86

Làm cách nào để phát hiện trong javascript nếu người dùng đang cuộn?


Không, tôi muốn từ một chức năng khác để viết if(scolling). Có if(window.onscroll)giống nhau không?
user1365010

Bạn có thể đặt scrollingtrong onscroll. (ps: không, không giống nhau)
Rocket Hazmat

3
Người dùng không bao giờ 'đang cuộn'. Chỉ có một hành động cuộn, không phải một trạng thái cuộn.
Kendall Frey

1
@ người dùng1365010: D'OH! Tôi không nghĩ về điều đó. Chính xác những gì bạn đang cố gắng để làm? Tại sao bạn cần biết người dùng đang cuộn?
Rocket Hazmat vào

2
Hấp dẫn. Tôi chưa bao giờ 'khởi động lại' một cuộn. Chăm sóc công phu?
Kendall Frey

Câu trả lời:


87

những công việc này:

window.onscroll = function (e) {  
// called when the window is scrolled.  
} 

biên tập:

bạn đã nói đây là một hàm trong TimeInterval ..
Hãy thử làm như vậy:

userHasScrolled = false;
window.onscroll = function (e)
{
    userHasScrolled = true;
}

sau đó bên trong Khoảng thời gian của bạn, hãy chèn cái này:

if(userHasScrolled)
{
//do your code here
userHasScrolled = false;
}

Nhưng đó là một hàm trong setInterval!
user1365010

4
@ user1365010: là gì? Bạn đang nói về cái gì Bạn cần bổ sung thêm chi tiết cho câu hỏi.
Rocket Hazmat

6
@ user1365010 câu trả lời này (về cốt lõi) là điều tốt nhất bạn có thể làm.
Matt Ball

#FYI, nó có vẻ không hoạt động khi vùng chứa đang cuộn, body.scroll () hoạt động, vì vậy tôi đã thêm cả hai,
Selva Ganapathi

12

Bạn vừa nói javascript trong thẻ của mình, vì vậy bài đăng của @Wampie Driessen có thể giúp bạn.

Tôi cũng muốn đóng góp, vì vậy bạn có thể sử dụng phần sau khi sử dụng jQuery nếu bạn cần.

 //Firefox
 $('#elem').bind('DOMMouseScroll', function(e){
     if(e.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.wheelDelta< 0) {
         //scroll down
         console.log('Down');
     }else {
         //scroll up
         console.log('Up');
     }

     //prevent page fom scrolling
     return false;
 });

Một vi dụ khac:

$(function(){
    var _top = $(window).scrollTop();
    var _direction;
    $(window).scroll(function(){
        var _cur_top = $(window).scrollTop();
        if(_top < _cur_top)
        {
            _direction = 'down';
        }
        else
        {
            _direction = 'up';
        }
        _top = _cur_top;
        console.log(_direction);
    });
});​

2
Không phải jQuery phải tóm tắt sự khác biệt của trình duyệt? Tại sao bạn có các phương pháp cho các trình duyệt khác nhau? Là $('#elem').bind('scroll'không đủ tốt? CHỈNH SỬA: Đừng bận tâm, tôi đã thấy ví dụ thứ 2 của bạn.
Rocket Hazmat

1
không có gì sai với một chút javascript bản địa thỉnh thoảng.
AGDM

Ý bạn là e.originalEvent.wheelDelta || e.originalEvent.detailkhông?
JacobRossDev

2
CẢNH BÁO: Các sự kiện bánh xe trong câu trả lời này là không chuẩn và không được dùng nữa. Sử dụng wheelsự kiện.
Alexander O'Mara,

Tôi chưa thử nghiệm điều này nhưng theo MDN DOMMouseScroll không được hỗ trợ trong hầu hết các trình duyệt developer.mozilla.org/en-US/docs/Web/Events/DOMMouseScroll
Liron Yahdav

6
window.addEventListener("scroll",function(){
    window.lastScrollTime = new Date().getTime()
});
function is_scrolling() {
    return window.lastScrollTime && new Date().getTime() < window.lastScrollTime + 500
}

Thay đổi 500 thành số mili giây sau sự kiện cuộn cuối cùng mà bạn cho là người dùng "không còn cuộn nữa".

( addEventListenertốt hơn là onScrollvì mã trước có thể cùng tồn tại độc đáo với bất kỳ mã nào khác sử dụng onScroll.)


0

Sử dụng một khoảng thời gian để kiểm tra

Bạn có thể thiết lập một khoảng thời gian để tiếp tục kiểm tra xem người dùng đã cuộn hay chưa, sau đó làm điều gì đó tương ứng.

Vay mượn từ John Resig vĩ đại trong bài viết của mình .

Thí dụ:

    let didScroll = false;

    window.onscroll = () => didScroll = true;

    setInterval(() => {
        if ( didScroll ) {
            didScroll = false;
            console.log('Someone scrolled me!')
        }
    }, 250);

Xem ví dụ trực tiếp

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.