jQuery Mousewheel doesn't support trackpad?

2019-07-04 03:31发布

I'm using the popular mousewheel plugin to to emulate the fullpage scroll like this website.

jQuery(function() {
    var top = 0,
        viewport = jQuery(window).height(),
        step = jQuery(".home .l-section:first").outerHeight(),
        body = jQuery.browser.webkit ? jQuery('body') : jQuery('html'),
        wheel = false;
    jQuery('body').mousewheel(function(event, delta) {
        wheel = true;
        if (delta < 0) {
            top = (top + viewport) >= jQuery(document).height() ? top : top += step;
            body.stop().animate({
                scrollTop: top
            }, 400, function() {
                wheel = false;
            });
        } else {
            top = top <= 0 ? 0 : top -= step;
            body.stop().animate({
                scrollTop: top
            }, 400, function() {
                wheel = false;
            });
        }
        return false;
    });
    jQuery(window).on('resize', function(e) {
        viewport = jQuery(window).height();
        step = jQuery(".home .l-section:first").outerHeight();
    });
    jQuery(window).on('scroll', function(e) {
        if (!wheel) top = jQuery(this).scrollTop();
    });
});

It works great but NOT when using the trackpad. Using trackpad, it just scrolls to the bottom of the page no matter how slowly I try to scroll.

4条回答
ゆ 、 Hurt°
2楼-- · 2019-07-04 04:16

to anyone else who finds this, the "mousewheel" event has been deprecated. https://developer.mozilla.org/en-US/docs/Web/Events/wheel

instead, use the "wheel" event you can use the "originalEvent" property on the wheel event to get to the attributes you would be expecting. (deltaX, deltaY, etc...)

查看更多
ら.Afraid
3楼-- · 2019-07-04 04:18

I solved my problem tracking with date(), so the user is not able to scroll any more if a certain time set by me, is not in the past.

Here is my snippet just using the 'wheel' function

  var last_time = new Date(); 
  $(window).bind('wheel', function(event) {
      var now = new Date();
      if((now - last_time) >= 1200)//Miliseconds
      {
        if (event.originalEvent.deltaY <= 0) {

            //Go up
          }
          else {
            //Go down
          }

          last_time = new Date(); 
        }
  });
查看更多
Animai°情兽
4楼-- · 2019-07-04 04:23

I have used underscore's debounce function to overcome this issue. This is the code I have used.

 $('...').mousewheel(_.debounce(function(event) {
   event.preventDefault();

   if(event.originalEvent.deltaY < 0){
      /* do your stuff when scrolling up */

   }else {
      /* do your stuff when scrolling down */

}, 40,true));
查看更多
兄弟一词,经得起流年.
5楼-- · 2019-07-04 04:32

Works well with my laptop's trackpad. However, this is known issue, did you try using debounce?

function mouseHandle(event) {
    newDate = new Date();
    var scrollAllowed = true;

    if( wheel < 10 && (newDate.getTime()-oldDate.getTime()) < 100 ) {
        scrollPos -= event.deltaY*(10-wheel);
        wheel++;
    }
    else {
        if( (newDate.getTime()-oldDate.getTime()) > 100 ) {
            wheel = 0;
            scrollPos -= event.deltaY*60;
        }
        else {
            scrollAllowed = false;
        }
    }

    oldDate = new Date();

    if( scrollAllowed ) {
        // do your stuff here
    }
}

//Apply this effect with jQuery On event
$('body').on('mousewheel', function(event) { mouseHandle(event); });

This is already reported issue here : https://github.com/brandonaaron/jquery-mousewheel/issues/36

You will get multiple solutions there. Hope that helps. Help yourself :-)

Peace,

Rahul

查看更多
登录 后发表回答