Android浏览器上的滚动事件未触发。需要解决方法

时间:2012-06-14 13:01:47

标签: javascript android events dom

我创建了一个带有视差街景的网站。有关存档版本,请参阅here

它适用于所有主流桌面浏览器和Safari Mobile。它在Mobile Firefox和Chrome for Android Beta中也能很好地工作。但是,默认的Android浏览器存在滚动事件的问题。让我说清楚。滚动不是问题。 div根据需要滚动。滚动事件不会触发。我在Honeycomb以及ICS上遇到过这个问题。

我并不关心其他移动浏览器,因为对于移动屏幕尺寸,人们通常看不到视差场景; mediaqueries和条件JavaScript加载可以解决这个问题。响应式设计和所有爵士乐。

基本上,我编写了一个parallise()jQuery插件,根据其位置和“深度”定位每个图像。此函数绑定到滚动事件。

在Android浏览器中,此事件仅在下次触摸开始时触发 ,而不是连续触发。

好的,所以我想如果我将函数绑定到touchstarttouchmovetouchend事件,我会解决我的问题。没有雪茄。 Other touch events are also bugged.应用建议的解决方法会导致事件触发,但正如我必须e.preventDefault()一样,滚动(练习的整个点)已被禁用。

如果我只是相对于窗口div轮询舞台div的位置怎么办?事实证明,位置信息仅在下次触摸开始时更新

我在我的系绳的尽头。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

即使触摸事件在Android的错误版本上正常工作,然后您可以在拖动过程中有效地跟踪本机滚动位置,这也很容易出错。例如,它不会考虑触摸完成后发生的动量动画。

iOS和Android做出牺牲以提高滚动性能。在两个平台上,在滚动完成之前,无法获得准确的滚动位置。在动量动画结束之前,滚动事件(在<body>上)不会触发。因此,虽然您最初的问题是关于溢出的<div>上的滚动事件,但修正此问题可能对您无益。

如果您希望动画能够及时更新滚动,则需要以编程方式执行滚动,而不是使用浏览器的本机滚动。执行此操作的最佳库是iScroll。您可以非常轻松地实现视差效果,如this demo中所示。

如果你需要更复杂的效果(在你的例子中是行走角色),你可以选择iScroll的“探测”版本,它允许像素完美的滚动位置轮询以换取降低的性能。

然而,使用iScroll有许多缺点:

  • 您可能需要更改标记和样式
  • 对于桌面浏览器来说,这是不必要的开销,但由于标记更改可能难以仅作为后备使用
  • 滚动感觉不会很完美 - 在iOS上,凭借其通常出色的滚动性能 - 动量计算的细微差别可能会让人感到不安。在Android上,滚动可能比平时更加​​滞后。

答案 1 :(得分:0)

滑动垫片,不需要在touchstart上防止默认:https://github.com/TNT-RoX/android-swipe-shim