javascript - 在 iOS 的 Safari 中向上滚动到最顶部会导致向上/向下滚动检测出现问题

标签 javascript ios safari

我有以下 Javascript 代码:

$(window).scroll(function() {
    if (window.innerWidth <= 768) {
        let scrollStatus = $(this).scrollTop();

        if (scrollStatus > lastScrollTop) {
            //do some stuffs

        else
            //do some other stuffs

        lastScrollTop = scrollStatus;
    }
});

因此它适用于非移动设备和 Android 设备。然而,当我在 iOS 的 Safari 上运行它并滚动到最顶部时,它会稍微向下拖动视口(viewport),然后在我松开手指时又弹回来。上面的 Javascript 代码将检测到向上滚动的反弹,并导致在 else 部分上触发,这是不希望的。我该如何解决这个问题?

最佳答案

在弹回之前,Safari 将 Y 位置过度滚动到负区域。您可以使用它来忽略弹跳动画的位置变化。

窗口滚动事件触发得非常快。出于性能原因,您不想直接处理这些事件。

下面的示例展示了如何以 250 毫秒的间隔检查用户是否滚动,这在性能上很容易。

var didScroll = false;

$(window).scroll(function() {
  didScroll = true;
});

// interval scroll handler
setInterval(function() {
  if ( didScroll ) {
    didScroll = false;
    scrolled();
  }
}, 250);

var lastScrollTop = 0;

function scrolled() {
  var scrollStatus = window.pageYOffset;

  if (scrollStatus < lastScrollTop) {
      //user scrolled up
  } else if ( lastScrollTop >= 0) {
      //user scrolled down
  }
  lastScrollTop = scrollStatus;
}

或者,您可以通过重置仅在滚动完成后调用 scrolled() 函数的超时来缓解性能问题。

var timer;

$(window).scroll(function() {
  if ( timer ) clearTimeout(timer);
  timer = setTimeout(function(){
    scrolled();
  }, 100);
});

var lastScrollTop = 0;

function scrolled() {
  var scrollStatus = window.pageYOffset;

  if (scrollStatus < lastScrollTop) {
      //user scrolled up
  } else if ( lastScrollTop >= 0) {
      //user scrolled down
  }
  lastScrollTop = scrollStatus;
}

关于javascript - 在 iOS 的 Safari 中向上滚动到最顶部会导致向上/向下滚动检测出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54321348/

相关文章:

ios - 创建类似于页面 Controller 的 Controller (不确定它叫什么或者它是否按原样存在)

angular - 使用 Angular Material 和 Safari 从另一个对话框打开对话框

html - 有没有证据表明 CSS 的顺序是相关的?

javascript - 在 Safari/Opera 上启用数据列表的脚本

javascript - 你能检测/重定向通过 javascript 按下的后退按钮吗?

ios - 如何在 View 中沿对角线显示渐变

javascript - 在 React 组件中获取数据的位置

ios - FCM在WiFi上一段时间后未收到通知

javascript - 如何从 JSON 数组中删除元素

javascript - 与在项目中使用简单的 Javascript 相比,像 Ember 或 Angular 这样的 Javascript 框架可能有哪些缺点和优点?