移动端阻止默认事件

为了提高页面滚动流畅性,Chrome56开始默认将touchstart和touchmove事件设为passive:true,忽略preventDefault()以实现即时滚动。然而这可能导致一些问题,比如阻止默认行为失效等。本文介绍了两种解决方法:一是明确声明事件监听器为非被动的;二是使用CSS属性touch-action:none。

由于浏览器必须要在执行事件处理函数之后,才能知道有没有掉用过 preventDefault() ,这就导致了浏览器不能及时响应滚动,略有延迟。

所以为了让页面滚动的效果如丝般顺滑,从 chrome56 开始,在 window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive: true。浏览器忽略 preventDefault() 就可以第一时间滚动了。

举例:
wnidow.addEventListener(‘touchmove’, func) 效果和下面一句一样
wnidow.addEventListener(‘touchmove’, func, { passive: true })
这就导致了一个问题:

如果在以上这 3 个元素的 touchstart 和 touchmove 事件处理函数中调用 e.preventDefault() ,会被浏览器忽略掉,并不会阻止默认行为。
测试:

body {
margin: 0;
height: 2000px;
background: linear-gradient(to bottom, red, green);
}

// 在 chrome56 中,照样滚动,而且控制台会有提示,blablabla
window.addEventListener(‘touchmove’, e => e.preventDefault())
那么如何解决这个问题呢?不让控制台提示,而且 preventDefault() 有效果呢?
两个方案:
1、注册处理函数时,用如下方式,明确声明为不是被动的
window.addEventListener(‘touchmove’, func, { passive: false })

2、应用 CSS 属性 touch-action: none; 这样任何触摸事件都不会产生默认行为,但是 touch 事件照样触发。
touch-action 还有很多选项,详细请参考touch-action

[注]未来可能所有的元素的 touchstart touchmove 事件处理函数都会默认为 passive: true

<think>嗯,用户问的是关于UniApp移动端的长按点击事件,我需要详细介绍一下。首先,我应该回忆一下UniApp中处理事件的相关知识。UniApp是基于Vue.js的,所以事件处理应该和Vue类似,但可能有自己的扩展。 长按事件移动端比较常见,比如长按弹出菜单或者触发某些特定操作。在UniApp中,应该有一个对应的长按事件,比如`longpress`或者`longtap`。需要确认具体的事件名称,可能不同的平台有不同的表现,但UniApp通常做了封装,统一使用某个事件名。 然后,我需要说明如何在组件上绑定这个事件,比如在按钮或者view上使用`@longpress`或者`@longtap`。要给出一个示例代码,展示基本用法,包括事件处理函数的定义和触发方式。 另外,可能需要提到事件对象的属性和注意事项,比如阻止默认行为或者事件冒泡。比如在事件处理函数中使用`event.preventDefault()`或者返回`false`,不过需要确认在UniApp中是否支持这些方法。 还要考虑不同平台的兼容性问题,比如在iOS和Android上的表现是否一致,是否有需要特别注意的地方。比如某些情况下,长按事件可能会触发系统的默认菜单,这时候需要如何阻止。 另外,可能用户需要知道如何区分长按和点击事件,避免同时绑定`@click`和`@longpress`时出现冲突。这时候可以建议在事件处理函数中通过时间阈值来判断,或者使用不同的处理逻辑。 还有,可以提到一些实际应用场景,比如长按列表项弹出操作菜单,长按图片保存到相册等,让用户更容易理解如何应用这个功能。 最后,是否需要介绍一些高级用法,比如自定义长按时间阈值,或者结合手势库来实现更复杂的效果。不过这可能超出基本介绍的范畴,但可以作为扩展内容简要提及。 总结下来,回答的结构应该是:介绍UniApp中的长按事件名称和绑定方式,示例代码,事件对象和注意事项,兼容性问题,区分长按与点击,实际应用场景,以及可能的扩展用法。这样用户能得到全面的信息,满足他们的需求。</think>在 UniApp 中,移动端的长按事件主要通过 `longpress` 事件实现,适用于需要用户长按某个元素触发特定交互的场景(如弹出菜单、预览内容等)。以下是详细介绍和示例: -- ### **1. 绑定长按事件** 在模板中直接使用 `@longpress` 或 `v-on:longpress` 绑定事件: ```html <template> <view @longpress="handleLongPress">长按我</view> <button @longpress="handleButtonLongPress">长按按钮</button> </template> ``` --- ### **2. 事件处理函数** 在 `methods` 中定义对应的处理函数: ```javascript <script> export default { methods: { handleLongPress(event) { console.log('长按触发', event); uni.showToast({ title: '长按成功!' }); }, handleButtonLongPress() { // 执行长按逻辑,如删除操作 } } } </script> ``` --- ### **3. 事件对象参数** 事件对象(`event`)包含以下常用属性: - `type`: 事件类型(如 `longpress`) - `target`: 触发事件的组件属性(如 `id`, `dataset`) - `timestamp`: 事件触发时间戳 - `touches`: 触摸点信息(坐标等) --- ### **4. 注意事项** - **兼容性**:`longpress` 在 iOS 和 Android 上表现一致,但需注意部分安卓机型可能默认有长按菜单(可通过 CSS 禁用)。 - **与点击事件区分**:避免同时绑定 `@click` 和 `@longpress` 时逻辑冲突,可通过延时或状态变量处理。 - **默认行为**:某些组件(如 `<image>`)长按会触发保存图片,需用 `@longpress` 覆盖默认行为。 --- ### **5. 自定义长按时间(高级)** 默认长按阈值约 350ms。如需调整,可通过原生事件模拟: ```html <view @touchstart="startTimer" @touchend="clearTimer" @touchcancel="clearTimer" >自定义长按时间</view> ``` ```javascript <script> export default { data() { return { pressTimer: null } }, methods: { startTimer() { this.pressTimer = setTimeout(() => { console.log('自定义长按触发'); }, 1000); // 设置 1000ms 触发 }, clearTimer() { clearTimeout(this.pressTimer); } } } </script> ``` --- ### **6. 典型应用场景** - 列表项长按删除/编辑 - 长按图片预览或保存 - 聊天消息长按复制/转发 - 游戏中的长按蓄力操作 -- 通过 `@longpress` 可以高效实现移动端的长按交互,建议结合 UniApp 的[官方文档](https://uniapp.dcloud.io/)进一步优化细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值