解决移动端页面滚动后不触发touchend事件

解决移动端页面滚动后不触发touchend事件

问题

在移动端页面进行优化时,一般使用touch事件替代鼠标相关事件。用的较多的是使用touchend事件替代PC端的click和mouseup事件。

可是,touchend事件在页面滚动时有个问题。在滚动完毕后,假设当前触点的位置所指的元素绑定了touchend事件,这时便会触发该元素的touchend事件,造成误操作。

解决方法

解决方法非常easy。就是在页面滚动时停止touchend事件冒泡。这样就能够防止触发touchend事件。

用法

引入该函数并进行调用。

function stopTouchendPropagationAfterScroll(){
    var locked = false;

    window.addEventListener(‘touchmove‘, function(ev){
        locked || (locked = true, window.addEventListener(‘touchend‘, stopTouchendPropagation, true));
    }, true);
    function stopTouchendPropagation(ev){
        ev.stopPropagation();
        window.removeEventListener(‘touchend‘, stopTouchendPropagation, true);
        locked = false;
    }
}

另外说明

在移动端,scroll事件是在滚动结束后才会触发一次。而touchmove事件是在滑动过程中多次触发。使用scroll会比使用touchmove在性能上有一定优化。

可是。上面代码之所以不用scroll事件,而用touchmove事件。是为了同一时候适用于小于一个屏幕高度的页面。所以也是不得已使用touchmove。

时间: 2024-10-12 21:22:25

解决移动端页面滚动后不触发touchend事件的相关文章

vb.net WPF webbrowser window.close 关闭后不触发 WindowClosing 事件 WNDPROC解决方案

 #Region "WPF 当浏览器窗口关闭时触发 Quit事件 " #If OnSourceInitialized Then Protected Overrides Sub OnSourceInitialized(e As EventArgs) 'onload 等句柄创建后引用WSInitialized(Me, e) WSInitialized(Me, e) MyBase.OnSourceInitialized(e) End Sub #Else Private Sub LyWeb

使用sessionStorage解决vuex在页面刷新后数据被清除的问题

https://www.jb51.net/article/138218.htm 1.原因 2.解决方法 localStorage没有时间期限,除非将它移除,sessionStorage即会话,当浏览器关闭时会话结束,有时间期限,具有自行百度 我这里使用sessionStorage,这里需要注意的是vuex中的变量是响应式的,而sessionStorage不是,当你改变vuex中的状态,组件会检测到改变,而sessionStorage就不会了,页面要重新刷新才可以看到改变,所以应让vuex中的状态

vb.net WPF webbrowser window.close 关闭后不触发 WindowClosing 事件 WNDPROC解决方式

 #Region "WPF 当浏览器窗体关闭时触发 Quit事件 " #If OnSourceInitialized Then Protected Overrides Sub OnSourceInitialized(e As EventArgs) 'onload 等句柄创建后引用WSInitialized(Me, e) WSInitialized(Me, e) MyBase.OnSourceInitialized(e) End Sub #Else Private Sub LyWeb

关于禁止页面滚动的实践(禁止滚轮事件)

禁止网页页面滚动只需要给document添加onmousewheel事件,然后在事件绑定函数当中设置e.preventDefault()就可以了,没错,就是芥末简单. 可是问题又来了,首先,onmousewheel是什么事件呢?它又有什么兼容性上的问题呢? 带着以上的两个问题,我通过查阅资料并且通过实践,得到了一下的认识. 1.onmousewheel是页面滚动事件,与onscroll不同的是,一般我们是通过onscroll来获取页面的滚动高度,然后添加相应的高度. 而onmousewheel,

解决移动端弹窗滚动事件触发主页面滚动事件

原理:点击菜单弹出层的同时 body html禁止滚动  $('body,html').css({'height':'100%','overflow':'hidden'});          弹出层退出时释放body html 解除禁止滚动   $('body,html').removeAttr("style");

移动端touchstar、touchmove、touchend 事件如果页面有滚动时不让触发 touchend 事件。

/*仅适用于内容中点击元素.对于拖动等元素,需要自行在页面处理. * 主要是绑定touchstart和touchmove事件,并判断用户按下之后手指移动了多少像素. * 如果手指移动距离小于10像素,则还是认为用户在做点击操作.如果移动距离超过了10像素,则取消后续事件监听函数的执行.*/ <script type="text/javascript"> function makeTouchableButton(ele) { if (!ele) { console.error

在angular中一个页面滚动后,打开新页面不在最顶部的解决办法

解决办法:使用$anchorScroll 找到当前页面的controller,在开头中加入以下部分代码,如图所示: $anchorScroll的剩余用法请参考官方文档: https://docs.angularjs.org/api/ng/service/$anchorScroll 原文地址:https://www.cnblogs.com/cnliang/p/10273583.html

解决vue单页面刷新后vuex中数据恢复初始值的问题

思路是页面关闭前将state的数据存储到浏览器缓存里,页面加载时再取出来存到state中 //App.vue created () { if (this.$getLocal("store")) { this.$store.replaceState( Object.assign({}, this.$store.state, this.$getLocal("store", "parse")) ); } window.addEventListener(

页面滚动后 顶部的透明度变化

css: body: margin-top:XXpx; .page_header_container: position:fixed; js: var $window = $(window), $body = $('body'), $bgMask = $('#page_header_container .bgMask'); $window.on('scroll', function() { if (parseInt($window.scrollTop()) > 0) { $bgMask.css(