浏览器滚动事件在iOS和Android设备上不会经常触发

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

它并不完全需要支持移动浏览器,但是如果它能在iPad上运行,那将会很不错 – 所以考虑到这一点,我开始testing各种手机和平板电脑。

我碰到的问题是,scrollorama依赖于经常被触发的滚动事件,因为这是animation被钩入的 – 然而,当使用触摸屏时,浏览器似乎只在启动拖动时触发滚动事件,当你停下来时 – 这在Opera Mini,Chrome,Safari,FF Mobile上是一致的。

为了让我的页面尽可能地完成部分工作,我需要提出一些能够让我更频繁地开展滚动活动的事情 – 有谁知道如何?

PS我已经尝试使用iScroll作为scrollorama文档build议,但是,这并没有工作,而是打破了animation,使滚动不可能 – 我敢肯定,插件本身的作品,但它似乎并没有很好地工作,已经得到了。 我正在寻找比插件更less的东西,只是一个片段,理想地触发滚动事件。

TL; DR

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


更新:我已经尝试挂钩触摸事件,并触发浏览器滚动,如下所示:

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

这似乎给我使用Firefox的Android更好的结果,虽然我不认为它是像我想要的那样频繁地触发它比什么都好。

我会在其他浏览器中testing,看看是否有帮助。

更新2:

上面的代码帮助了Android上的FF,而不是在iPhone上。 我尝试添加iPhone的手势事件处理程序,但没有改变。

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

Pre-iOS 8:

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

Safari WebKit是每个Apple策略在所有iOS浏览器中强制使用的HTML呈现组件,可在滚动手势期间停止重新绘制以节省电池寿命并降低热量。 请注意,即使屏幕无法反映滚动手势期间对DOM做出的任何实时更改,JavaScript在滚动手势期间仍会在后台继续正常运行。 一旦手势结束,立即开始绘画事件,屏幕更新。 但是,定时器循环(例如通过setInterval设置的循环)在滚动手势期间不会触发。

另外值得注意的是,如果您在开始滚动时非常缓慢地移动手指,则直到您将手指从其起始位置移开大约10个像素后,滚动手势才会生效。 在这个10像素半径范围内的移动过程中,屏幕会瞬间刷新。 WebKit决定您的手指移动足够远以启动滚动时,屏幕刷新将被禁用,直到滚动手势结束。

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

iOS 8及更高版本:

苹果公司正在使iOS 8的滚动事件更加stream畅:

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

在我这边,我禁用了ios Chrome的function

 // Fix Chrome iOS if(!navigator.userAgent.match('CriOS')){ // do my stuff here } 

我不知道没有刷新滚动屏幕的导航器的完整列表。 如果有人可以帮忙;)