javascript - 浏览器滚动事件在 iOS 和 Android 设备上触发不够频繁

标签 javascript android ios scroll

我正在使用 jQuery、greensock 和 scollorama 开发一个单页网站。

它并不完全需要支持移动浏览器,但如果它能在 iPad 上运行就更好了——考虑到这一点,我开始在各种手机和平板电脑上进行测试。

我遇到的问题是 scrollorama 依赖于相当频繁地触发滚动事件,因为这是动画所 Hook 的 - 但是,当使用触摸屏时,浏览器似乎只在您开始时触发滚动事件拖动和停止 - 这在 Opera Mini、Chrome、Safari、FF Mobile 中是一致的。

为了让我的页面至少部分工作,我需要想出一些能让我更频繁地触发滚动事件的东西 - 有人知道怎么做吗?

P.S 我试过按照 scrollorama 文档的建议使用 iScroll,但是那没有用,反而破坏了动画并使滚动变得不可能 - 我确信插件本身可以工作,但它似乎不能很好地与我已经得到了什么。我正在寻找比插件更少涉及的东西,只是理想地触发滚动事件的 fragment 。

长话短说

带有触摸屏的设备在拖动过程中似乎只会触发一次或两次 javascript 滚动事件。有没有我可以在 JS 或 jQuery 中做的简单补丁,它会更频繁地触发滚动事件?


更新:我试过 Hook 触摸事件并触发浏览器滚动,如下所示:

    $(document).on('touchstart touchend touchmove', function(){
        $(window).trigger('scroll');
    });

这似乎让我在使用 Firefox 的 Android 上获得了更好的结果,尽管我认为它的触发频率不如我希望的那样总比没有好。

我会在其他浏览器中进行测试,看看是否有帮助。

更新 2:

上面的代码对 Android 上的 FF 有很大帮助,但对 iPhone 没有帮助。我尝试为 iPhone 触发的手势事件添加处理程序,但没有任何变化。

$(window).on('touchstart touchend touchmove mousewheel touchcancel gesturestart gestureend gesturechange orientationchange', function(){
        //alert($(window).scrollTop());
        $(window).trigger('scroll');
    });

最佳答案

iOS 8 之前的版本:

这不是滚动事件被触发足够多的问题。相反,iOS 上的浏览​​器会在滚动手势中间停止刷新(即“重新绘制”)屏幕。

Safari WebKit 是根据 Apple 的政策在所有 iOS 浏览器中强制使用的 HTML 呈现组件,它会在滚动手势期间停止重新绘制以节省电池生命周期并减少热量。请注意,在滚动手势期间,JavaScript 确实会继续在后台正常运行,即使屏幕无法反射(reflect)在滚动手势期间对 DOM 所做的任何实时更改。一旦手势结束,就会立即触发一个绘画事件,并且屏幕会更新。但是,计时器循环(例如通过 setInterval 设置的那些)不会在滚动手势期间触发。

还值得注意的是,如果您在启动滚动时移动手指的速度非常慢,则滚动手势只有在您将手指从其起始位置移动大约 10 个像素后才会生效。在这 10 像素半径内移动时,屏幕会持续瞬间刷新。当 WebKit 确定您的手指移动得足够远以启动滚动时,屏幕刷新将被禁用,直到滚动手势结束。

这个问题不影响“某些”网页或 JavaScript 库的原因是它们有效地“卡住”了页面的滚动,而是通过拦截触摸事件然后调整 body.scrollTop相应的属性。它们通过将事件处理程序附加到 onscroll 事件来卡住页面的滚动,并从事件处理程序中发出 event.preventDefault() 命令。

iOS 8 及更高版本:

Apple 正在使 iOS 8 中的滚动事件更加流畅:

http://developer.telerik.com/featured/scroll-event-change-ios-8-big-deal/

关于javascript - 浏览器滚动事件在 iOS 和 Android 设备上触发不够频繁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21524839/

相关文章:

ios - 显示没有导航 View Controller 的后退按钮

Android 应用程序到 IOs 移植?

ios - objective-c -完成表格单元格标签上的删除线

javascript - 正则表达式匹配变量赋值 ("a=12") 但忽略函数赋值 ("f(x)=x^2")

android - 在 Smack 4.1 中实例化 ConnectionConfiguration

android - 原因 : org/codehaus/groovy/runtime/typehandling/ShortTypeHandling

单个 Activity 中的 Android 搜索 Activity

javascript - polymer 硫化 保持外部链接

javascript - AngularJS 不处理 JSON 引用

javascript - Blackberry Web Works 如何在每次启动应用程序时触发事件