首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法

做完之后在手机原生浏览器中运行正常,但在QQ和微信中打开,发现touchmove只会触发一次,而且touchend也经常不触发。...之后百度了一下这个问题,原因是 主要是由于200ms超时导致内核不一定会一直处理touchmove事件,一旦超时会将后续所有的事件转交给UI处理,导致touchmove不会一直触发。...之后继续百度,得知当在移动端上点击屏幕时,会依次触发touchstart,touchmove,touchend,click事件。...原来touchmove中添加event.preventDefault方法之后会阻止浏览器默认的滚动。。。...然后我打开了这个插件的源码,终于在touchmove中找到了答案 在touchmove中有这样一段代码(下面是我自己抄过来简化过的): var w = x<0?

3.1K20

Unable to preventDefault inside passive event listener

所以为了让页面滚动的效果如丝般顺滑,从 chrome56 开始,在 window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive...举例: wnidow.addEventListener('touchmove', func) 效果和下面一句一样 wnidow.addEventListener('touchmove', func, {...passive: true }) 这就导致了一个问题: 如果在以上这 3 个元素的 touchstart 和 touchmove 事件处理函数中调用 e.preventDefault() ,会被浏览器忽略掉...两个方案: 1、注册处理函数时,用如下方式,明确声明为不是被动的 window.addEventListener('touchmove', func, { passive: false }) 2、应用...touch-action 还有很多选项,详细请参考touch-action [注]未来可能所有的元素的 touchstart touchmove 事件处理函数都会默认为 passive: true

1.3K20

滚动穿透的6种解决方案【已自测】

局限问题: 因为touchmove被禁掉了,就会造成弹窗内部所有位置都不能响应touchmove事件,效果上就是弹窗内部不能再滚动了。 赘述: 在弹层不需要超出滚动的情况下,才可以使用这个。...那么这时,就引来我们的主题难点,可以有以下几种思路解决: 四、body滚动 + 弹层内部滚动[js-检测touchmove的target] 简单粗暴,一针见血:谁能动谁动,谁不能动就禁止touchmove...所以依旧需要同样的代码,对可滚动区域的touchmove做监听:若到顶或到底,同样阻止默认事件。...2、禁掉弹窗的touchmove 的默认事件 ? 3、重写手势滑动效果 ?...2、touchmove手势移动的时候,再次获取最新的坐标点y的值y2,(其实记录可滚动区域的可滚动高度、当前滚动距离等可以在一开始就记录,我这里写到了touchmove里,还可以再优化)。

13.4K31

移动端 模拟手机联系人触摸A~Z导航

有些手机的音乐导航也类似,具体可详见下图: touchmove的问题 在移动端,我们可以使用touch事件进行处理,此处首先想到的是使用touchmove事件。...本身touchmove事件是会随着手指不断接触屏幕而不断被触发,而在事件的知识当中,我们有事件委托以及事件目标对象e.target的技术,因此,基本的实现思路就成了:将touchmove事件绑定在字母元素的父级身上...想法是好的,但是在实际的操作中发现,虽然touchmove会触发多次,但是并不能够实时获取e.target(事件目标对象),这也就使得上面的这种思路成了空想。...移动端开发 模拟手机联系人导航 a~z的拖拽 touchmove...document.getElementById('con'); var list = document.getElementById('list'); list.addEventListener('touchmove

1.5K50

在小程序里实现手势缩放,你可以这样做 | 实战教程

我们发现微信提供 touchmove 事件,在用户触摸屏幕并在屏幕上移动手指时,这个事件就会被触发。 手势缩放的核心思想是:根据两只手指相对距离的变化,对图片进行放大或缩小。...touchmove 事件可以实现的功能,大致可以总结为: 手指在屏幕上进行移动时,touchmove 事件就会以 16 ms 一次的频率不断被触发; 手指离开屏幕时,touchend 事件会被触发。...touchmove 事件所包含的事件对象中有一个 touches 属性,此属性为当前停留在屏幕中的触摸点信息的数组。...现在,我们为图片对象绑定 touchmove 事件。在每次 touchmove 被触发后,我们都可以计算出新的图片需要被放大的倍数,我们将这个变量定名为 scale。...具体方式是:在每次 touchmove 被触发后,通过探测手指距离变化而得到的数据,来得到图片按比例缩放后的高宽值。

1.9K20

【425】在页面对象中启用模板方法模式(Template Method Pattern)

得益于js的不严谨性,我们在Page中以一种不一样的返回值,重写了touchMove、touchEnd这两个方法,使其由不返回,改为返回布尔值。稍后我们在子类中会看到这个重写的作用。...(e) { if (super.touchMove(e)){ this.leftPanel.touchMove(e) } } /// 触点结束事件回调函数 touchEnd...和touchEnd方法中,我们通过调用父类中的模板方法touchMove或touchEnd,获知了当前事件是否需要处理。...render() { super.render() ... } /// 触点移动事件回调函数 // touchMove(e) { } /// 触点结束事件回调函数...touchMove和touchEnd方法,不是Page类定义的,但它们也可以算作模板方法的一部分,并且充分体现了模板方法作为模板的意义,而不仅仅是作为一个父类中被重写的方法符号。

80910

Unable to preventDefault inside passive event listener due to target being treated as passive 怎么办?

具体情况: 从 chrome56 开始,在 window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive: true。...导致下面的效果一致: wnidow.addEventListener('touchmove', func) 效果和下面一句一样 wnidow.addEventListener('touchmove',...func, { passive: true }) 这样会出现新的问题: 如果在以上这 3 个元素的 touchstart 和 touchmove 事件处理函数中调用 e.preventDefault(...linear-gradient(to bottom, red, green); } // 在 chrome56 中,照样滚动,而且控制台会有提示,blablabla window.addEventListener('touchmove...两个方案: 1、注册处理函数时,用如下方式,明确声明为不是被动的 window.addEventListener(‘touchmove’, func, { passive: false }) 2、应用

63910
领券