阻止移动端 touchmove 与 scroll 事件冲突

2023-11-16

在移动端开发过程中,如果要实现一个元素或按钮的拖动定位,会出现很多坑。例如:元素上下移动过程中,会触发 bodyscroll 事件,导致整体的位置偏移,这时就需要 阻止移动端 touchmove 与 scroll 事件冲突

DOM Touchmove Scroll

一、解决思路

  1. 当移动端 touchmove 与 scroll 事件冲突时,首先想到的就是在 touchmove 事件监听过程中阻止默认事件(e.preventDefault())。
  2. 如果你这样做了,紧接着你就会看到控制台的报错:[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive.
  3. 然后通过 MDN ,得知 addEventListener 方法的第三个参数 options 有很多可选配置。
  4. options 是一个指定有关 listener 属性的可选参数对象。可用的选项如下:
参数 定义
capture 一个布尔值,表示 listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。
once 一个布尔值,表示 listener 在添加之后最多只调用一次。如果为 truelistener 会在其被调用之后自动移除。
passive 一个布尔值,设置为 true 时,表示 listener 永远不会调用 preventDefault()。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。查看 使用 passive 改善滚屏性能以了解更多
signal AbortSignal,该 AbortSignalabort() 方法被调用时,监听器会被移除。

二、问题所在

因为将 passive 设为 true 可以启用性能优化,并可大幅改善应用性能,所以大部分浏览器(Safari 和 Internet Explorer 除外)将文档级节点 Window、Document 和 Document.body 上的 wheel、mousewheel、touchstart 和 touchmove 事件的 passive 默认值更改为 true 。如此,事件监听器便不能取消事件,也不会在用户滚动页面时阻止页面呈现。
因此,当你想要覆盖这一行为并确认 passive 在所有浏览器中都被设为 false,你必须显式地将其设为 false,而不是依赖浏览器的默认设置。

  • 关键代码:
document.addEventListener('touchmove', touchmove, {
  passive: false,
})

function touchmove(e) {
  e = e || window.event
  // do something
  e.preventDefault()
}

参考文档:


欢迎访问:天问博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阻止移动端 touchmove 与 scroll 事件冲突 的相关文章

  • 如何向上转型以限制对象属性

    在 JavaScript 中 如何从子类向上转换到超类以自动删除超类中不存在的对象属性 示例 假设有以下 2 个类 class ClassA constructor public a string public b string class
  • 如何在通过 .ajaxForm() 提交表单之前执行一些操作?

    我正在使用 ajaxForm 框架来发送我的数据 而无需重新加载我的页面 ReplayForm ajaxForm success function data alert Success 现在 我想在提交表单之前检查一些条件 如果条件为假 则
  • 使用 Jest 和 React JS TestUtils 测试表单

    我有一个带有 3 个单选按钮的表单 如下所示 假名
  • Eslint 从另一个文件确定全局变量

    我试图以这样的方式设置 ESLint 使其在对实际目标文件进行 linting 之前解析全局声明文件 这样我就不必将所有确实是全局的函数和变量声明为全局 而是让解析器弄清楚 In 一些 模块 js function do something
  • Mapbox GL 中的 MaxBounds 和自定义非对称填充

    我有一个 Mapbox GL JS 应用程序 在地图上显示一些小部件 为了确保地图上的任何内容都不会被它们隐藏 我使用以下命令添加了一些填充map setPadding 这是一个不对称的 在我的例子中左边比右边大 它按预期工作 例如fitB
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • 此页面上的脚本导致 ie 运行缓慢

    问题就在标题中 IE 行为异常 并说有一个脚本运行缓慢 FF 和 Chrome 没有这个问题 我怎样才能找到问题所在 那个页面有很多JS 手动检查不是一个好主意 EDIT 这是我正在处理的一个项目的页面 但我需要一个工具来查找问题 End
  • API 使用令牌向 odoo 进行身份验证

    我想使用令牌从 Express 应用程序向 Odoo 进行身份验证 我在用odoo xmlrpc https www npmjs com package odoo xmlrpc连接 Odoo 的节点模块 我的快递应用程序 Odoo 要求 A
  • JS 保留以零结尾的小数[重复]

    这个问题在这里已经有答案了 在JavaScript中 是否可以 锁定 十进制数 以保留以零结尾的 浮点数 例如 我有 2 个不同的数字 如下所示 伪代码 let a 1 0 let b 1 00 a b true should be fal
  • 为什么这行带有“await”的代码会触发微任务队列处理?

    以下引用是我理解微任务队列处理的主要参考 当 JS 堆栈清空时 就会处理微任务 承诺使用 杰克 阿奇博尔德 https twitter com jaffathecake status 954653170986311680 这对我来说没有意义
  • JavaScript 将键添加到数组中的每个值

    我下面有这个数组 它由一个简单的数组组成 我想要完成的是放一把钥匙id在每个数组值前面以实现类似的效果 id a id b id c id d 有没有一种简单的方法可以做到这一点 任何帮助将不胜感激 谢谢 var test a b c d
  • 将 Firebase FCM 添加到 ReactJS 应用程序

    我正在尝试向我的 ReactJS 应用程序中的用户发送推送通知 我已添加 firebase 请求用户通知权限 这正在发挥作用 但现在我想注册设备令牌 但这给了我错误 消息传递 我们无法注册默认的 Service Worker 无法注册 Se
  • 当我多次调用 requestAnimationFrame 时会发生什么

    我的意思是一次调用多个具有相同功能的 requestAnimationFrame function Draw DoSomething function AFunc prepare something requestAnimationFram
  • 模板中带有 ng-if 的 angularjs 指令

    我正在构建一个在模板内使用 ng if 的指令 奇怪的是 提供给链接函数的元素没有扩展ng if代码 它只是ng if的注释行 经过一番尝试 我发现通过将链接代码包装在 timeout 中似乎可以使其正常工作 但我想知道这是否不是正确的处理
  • 类中可以有生成器 getter 吗?

    我的意思是吸气剂是发电机 我相信这一切都是 ES6 也许像这样 class a get count let i 10 while i yield i let b new a for const i of b count console lo
  • 如何在 webpack 中渲染嵌套的 SASS?

    采取以下CSS MyComponent color blue Button color red 以及以下 React 组件 import React from react import classes from MyComponent sc
  • 语法错误:意外的标记“?”在 repl.it 上用 JavaScript 制作不和谐机器人时 [重复]

    这个问题在这里已经有答案了 我收到错误 const token this client token this client accessToken SyntaxError Unexpected token Discord 机器人代码 con
  • ThreeJS 中阴影的奇怪行为

    所以我有一个 ThreeJS 场景 并且添加了一些球体 多材质 我还添加了定向光 this light new THREE DirectionalLight 0xFFFFFF 1 this light position set 2 10 2
  • 确定 Javascript 中的日期相等性

    我需要找出用户在 Javascript 中选择的两个日期是否相同 日期以字符串 xx xx xxxx 形式传递给该函数 这就是我需要的全部粒度 这是我的代码 var valid true var d1 new Date datein val
  • Chrome 扩展:强制 popup.html 关闭

    我想知道是否可以强制 popup html 关闭 在弹出的 javascript 中 window close

随机推荐

  • 一大波 Android 刘海屏来袭,全网最全适配技巧!

    一 序 Hi 大家好 我是承香墨影 Apple 一直在引领设计的潮流 自从 iPhone X 发布之后 刘海屏 就一直存在争议 不过不管你怎样 Android 也要跻入 刘海屏 的行列 尤其是 Android P 发布之后 也从系统级支持顶
  • mysql auto connect_Mysql autoReconnect 的问题

    MySQL官方不推荐使用autoReconnect true 参见 http bugs mysql com bug php id 5020 需要另外找别的办法来解决超过8小时 链接断开的问题 由于问题产生的根本原因在于服务到数据库的连接长时
  • mysql的workbench在哪_MySQL Workbench的使用方法(图文)

    MySQLWorkbench 是 MySQL AB 最近释放的可视数据库设计工具 这个工具是设计 MySQL数据库的专用工具 MySQLWorkbench 拥有很多的功能和特性 这篇由DjoniDarmawikarta 写的文章通过一个示例
  • JavaScript将一层级对象数组转为children嵌套的三层级树状对象数组(多级树状分类)

    有时候后端返回的数据不适合前端 我们就需要进行转换 比如我想用elementUI的级联选择器 而这个组件对数据格式有要求 本篇文章将介绍如何将一层级对象数组数据格式转为三层级嵌套children数组 JavaScript Vue 小程序等都
  • 信息学奥赛一本通 1240:查找最接近的元素

    题目链接 http ybt ssoier cn 8088 problem show php pid 1240 include
  • 数据库相关知识和进阶知识

    目录 MySQL与Orcale EXPLAIN介绍 EXPLAIN 可以分析慢查询原因 查看MySQL存储空间大小 MySQL事务锁不执行严格的校验
  • Retrofit实现文件上传和下载【二】

    概述 通过前一篇的博客介绍 我们已经对Retrofit的使用有了一个大概的了解 今天来讲讲利用Retrofit进行文件的上传和下载 文件上传 服务器使用的是SSH框架 因此这里是以struts2的方式来获取数据的 我这里定义了三个字段用来接
  • Java发送手机短信验证码

    本次使用的是阿里云的短信服务 1 添加短信签名 签名名称要用的 在阿里云产品中搜 短信服务 gt 免费开通 gt 国内消息 2 添加短信模板 模版CODE需要用的 就在添加签名的旁边 3 创建用户 用户令牌和密码需要用的 然后选择 开始使用
  • bug复刻,解决方案---在改变div层级关系时,导致传参失败

    问题描述 在优化页面时 为了实现网页顶部遮挡效果 内容滚动 顶部导航栏不随着一起滚动 并且覆盖 做法是将内容都放在一个div里面 为这个新的div设置样式 margin top width heigh等 网页效果的确实现了 但是出现的新的问
  • Chisel实验笔记(一)

    最近在学习Risc v 其中伯克利大学开源了一款兼容Risc v指令集的处理器Rocket 而Rocket处理器是采用Chisel编写的 所以要学习Chisel Chisel的简单介绍如下 Chisel Constructing Hardw
  • 基于Arduino的音乐动感节奏灯

    1 音乐动感节奏灯是个什么东西 前段时间听音乐觉得无聊 便想着音乐光听也没意思啊 能不能 看见 音乐呢 于是谷歌了一番 发现还真有人做了将音乐可视化的东西 那就是音乐节奏灯 说的简单点就是LED灯光颜色亮度等随着音乐的节奏而发生变化 看了下
  • 最新机器人工程专业毕设选题推荐

    文章目录 1前言 2 如何选题 3 机器人工程 毕设 选题推荐 4 最后 1前言 近期不少学弟学妹询问学长关于机器人工程专业工程专业相关的毕设选题 学长特意写下这篇文章以作回应 以下是学长亲手整理相关的毕业设计选题 都是经过学长精心审核的题
  • Python-声明变量

    Python如何声明变量 在 Python 中 定义变量非常简单 只需要为变量赋一个值即可自动创建该变量 并推断出变量的数据类型 变量名可以是任意字母 数字或下划线组成 但是不能以数字开头 例如 定义名为 name 的变量 并将字符串 To
  • event类型 php,深入解析PHP的Laravel框架中的event事件操作

    有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑 比如说系统服务下的授权和事件 这些功能服务的应用场景是什么 其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情 但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都
  • 服务器的协议端口在哪里设置,服务器的远程端口号在哪里设置

    服务器的远程端口号在哪里设置 内容精选 换一换 Linux云服务器一般采用SSH连接方式 使用密钥对进行安全地无密码访问 但是SSH连接一般都是字符界面 有时我们需要使用图形界面进行一些复杂操作 本文以Ubuntu 18 04操作系统为例
  • 飞旭体质健康测试云平台学生体质测试管理系统

    飞旭体测数据管理云平台是由体测设备 微信小程序和云平台构成 用户通过设备测试后 数据传输至云端 由云平台对数据进行针对性的统计分析 平台功能包括管理员分级管理 学生体质测试 学生体质测试成绩查询 测试数据管理统计分析 数据上报管理等内容 具
  • 15 周带你学好大一C语言!最详细C语言学习路线

    要学习 C 语言的读者抓紧时间看一下 我按照C语言学习视频的目录整理了一条以 周为单位时间 的学习路线 希望在开学后能按照这个进度去学习一遍 有要学习 C 语言的读者也可以参照 可能有些知识学习起来比较困难 比如说二进制这种涉及到底层方面的
  • iperf linux移植

    参考链接 1 iperf的git地址 windows版下载地址 git clone https github com esnet iperf git 2 下载到ubuntu上 3 找到交叉工具包的位置 opt arm ca9 linux g
  • 绘制复杂的层次的原理图

    一 绘制总体的区域块模块 1 新建一个PCB项目 在new中的project选择PCB 2 在项目中新建一个sheet文件 schemetic 然后找到place中的sheet Symbol Actions 3 修改每一个绿块的名称和文件名
  • 阻止移动端 touchmove 与 scroll 事件冲突

    在移动端开发过程中 如果要实现一个元素或按钮的拖动定位 会出现很多坑 例如 元素上下移动过程中 会触发 body 的 scroll 事件 导致整体的位置偏移 这时就需要 阻止移动端 touchmove 与 scroll 事件冲突 一 解决思