检测触摸开始/触摸结束是否取消了滚动(动量滚动)
detect if a touchstart/touchend has cancelled a scroll (momentum scroll)
我侦听TouchStart和Touchend事件,以使我的应用程序对移动设备的响应更快。
问题是,如果您"轻拂滚动"(即使手指离开屏幕,页面仍在滚动),然后点击停止滚动 - 如果 touchend 上有一个事件附加到您点击的元素,它将触发。
我需要一种方法来检测触摸开始或触摸结束是否已停止滚动,以便我可以停止任何事件触发。
我尝试在滚动上设置一个变量(我注意到移动设备上的滚动事件仅在滚动完成后触发,即即使在动量滚动时页面也已停止):
$(window).scroll(function(){
cancelled_scrolling = true;
setTimeout(function(){
cancelled_scrolling = false;
},200);
});
但是,当我点击时,触摸端似乎在 .scroll() 事件之前触发,因为这不起作用:
$('body').on('touchend', function(){
if(cancelled_scrolling){
alert('ahahahah');
return false;
}
//code to trigger events depending on event.target after here
});
我怎样才能做到这一点?
编辑:
找到了答案——
步骤1 - 保存滚动顶部触摸端步骤2 - 在触摸启动时,检查保存的滚动顶部与新的滚动顶部
- 如果不匹配,则即使在发生 TouchEnd 事件后,页面也会滚动
在touchStart
上,跟踪每个父节点的scrollTop
和scrollLeft
。在 touchMove
上,检查这些值中的任何一个是否已更改。如果是这样,请取消触摸。这比只检查touchEnd
稍微好一点,因为也许他们滚动了页面然后取消滚动。
您还可以在此处看到实现的此逻辑:https://github.com/JedWatson/react-tappable/blob/cf755ea0ba4e90dfa6ac970316ff7c35633062bd/src/TappableMixin.js#L120
相关文章:
- 谷歌地图劫持了iphone's滚动(触摸事件)-如何恢复
- 如何检测滚动事件是否像在触摸设备上一样只触发一次
- Sencha触摸:工具栏无法正常滚动
- jQuery触摸滑动内容滚动功能
- 停止触摸滚动还可以防止单击链接
- 移动/触摸屏幕 - 滑动时水平滚动
- 允许在隐藏溢出的情况下进行触摸滚动
- 整页.js触摸滚动固定元素
- 检测触摸向上或向下滚动
- 移动HTML:触摸结束后继续滚动
- JS中的触摸板滚动检测,没有库
- 拖动滚动触摸设备,如手机/ iPad
- 在触摸设备上,滚动是使用 javascript 创建的,如何防止触摸触发单击
- 拉动刷新:滚动过程中触摸可将滚动条设置为页面底部
- 触摸事件的挖空事件绑定导致滚动问题
- 一页滚动iPad触摸滚动
- 触摸板滚动jQuery的问题
- 触摸拖动画布时滚动页面
- 在移动safari中有条件地阻止滚动/触摸事件
- iOS:-webkit溢出滚动:触摸并滚动顶部