在触摸移动后,Touchend事件未触发。

15

我正在尝试为移动设备制作一个页面,该页面可以检测scrollTop的位置,并且在scrollTop小于文档高度的一半时滚动到页面顶部,否则滚动到底部。

我使用以下代码实现了这个功能:

var ScrollTimeout;
$(window).on('scroll',function(){
    clearTimeout(ScrollTimeout);
    ScrollTimeout = setTimeout(scrollToTopOrBottom,200);
    });

问题在于当用户停止滚动但手指仍在屏幕上时,超时会触发。

然后我使用了touchend事件,效果很好。

$(document).on('touchend',function(){
    scrollToTop();
    });

用户可以在手指仍然触摸屏幕的情况下停止滚动,然后继续滚动而不触发scrollToTopOrBottom()函数。

问题是,在各种浏览器之间,此事件的表现不一致:

在某些浏览器(Maxthon 和 Android)中,touchend 事件按预期工作,但在 Opera Mobile 和 Chrome 中,touchend 事件不会触发。这是因为touchend 不会触发,因为它之前已经触发了 touchcancel

我已经尝试过这个方法。

$(document).on('touchmove',function(e){
    e.preventDefault();
    });

他成功地避免了触发touchcancel事件,但不幸的是也避免了滚动的自然行为。

有人知道如何实现这个功能吗?我已经没有任何想法了。

谢谢。

2个回答

22

尝试在touchend和touchcancel事件上都附加监听器。

$(document).on('touchend touchcancel', function() {
    doSomthing();
});

1
尝试了各种方法来使Android 4.4上的touchends正常工作,这是唯一有帮助的事情!谢谢! - mls3590712

1

不适用于安卓4.4.4默认浏览器...甚至不调用事件(例如swipeUp)。 - jfaron
可以工作,但滑动事件取决于容器的滚动。我认为手动滚动更可取。 - Mr. TA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接