tap 和click 事件区别

介绍下tap和click的区别:

两者都会在点击时触发,但是在web手机端,clikc会有200-300ms的延时,所以要用tap代替click作为点击事件,singleTap和doubleTap分别作为单次点击和双击,但是使用tap会带来点透事件(事件穿透)。

介绍下什么是tap事件穿透:

执行完上层绑定的tap事件后,下层如果绑定这click事件或者本身就存在点击事件(a/input)也会默认触发,这就是tap点透事件

下面正规解释下tap点透事件发生的场景:

当A/B两个层上下Z轴叠层,上层的A点击后消失或者移开(原因接下来会讲),当B元素本身默认有click事件或者绑定click事件,这种情况下,点击A/B重叠的部分,就会出现点透事件

点透现象出现的原因:

首先要知道tap事件是通过监听绑定document上的touch事件来模拟的,并且tap事件是冒泡到document上才触发的;

touchstart:在这个dom上用手触摸就能开始

click:在这个dom上用手触摸,且手指未曾移动,且在这个dom上手指离开屏幕,且触摸和离开时间很短(有的浏览器可能不检测时间间隔,照样可以触发click),才开始触发。

也就是说在移动端的事件触发从早到晚排序:touchstart  touchstop click 。 所以click的触发是有延时的,about 300ms

由于我们在touchstart阶段就已经隐藏了A,当click被触发时,能够被点击的就是B;

介绍下click事件的触发规则:

触发当前有click的元素,且该元素面朝用户的最前端,才会触发click。

上面B中,由于B绑定了click或者B本身存在click,所以B也被触发了,(因为在touchstart阶段就已经隐藏了A),于是就产生了点透事件

介绍下解决方法:

1.github上有一个叫做fastclick的库https://github.com/ftlabs/fastclick

$(function(){
 
    newFastClick(document.body);
 
})


然后给需要的元素绑定click事件,这样就不会延时啦,据说还会比tap更快

 

2.为元素绑定touchend事件,并在内部加上e.preventDefault();

$A.on('touchend',function(e){//而touchend是原生的事件,在dom本身上就会被捕获触发
 
    $demo.hide()
    e.preventDefault();
 
})

监听touchend事件,阻止A元素的touchend的默认行为,从而阻止click事件的产生

<think>好的,我现在需要回答用户关于Uniapp中tapclick的问题。首先,我得确定用户对这两个事件的理解程度,可能他们遇到了事件处理上的困惑或者想了解区别应用场景。 首先,我应该回忆一下Uniapp的文档。Uniapp是一个跨平台框架,支持多端转换,所以事件处理可能会有不同表现。在web环境中,click是常见的点击事件,但在小程序中,tap可能更常用。 接下来,tapclick的主要区别是什么?我记得tap小程序中的触摸事件,而click是web的。tap的响应更快,因为它是立即触发的,而click在移动端可能会有延迟,因为浏览器会等待判断是否是双击或者滚动。这点需要详细说明。 然后,要考虑它们在Uniapp中的使用情况。比如,在微信小程序中,通常使用tap事件,而H5端可能默认用click。但Uniapp做了封装,可以用@tap来统一处理,可能内部做了多端适配,这样开发者无需关心平台差异。需要确认这一点是否正确,可能需要查阅Uniapp的事件处理文档。 另外,阻止事件冒泡方面,tap可能使用@tap.stop,而click使用@click.stop,但Uniapp是否统一了这些修饰符?比如,在编译到不同平台时,会自动转换吗? 还需要提到兼容性问题。比如,在H5端,使用@tap会被转换成click事件,这样可能会有延迟。这时候可能需要额外的处理,比如使用fastclick库或者Uniapp的配置项来消除延迟。这部分对用户来说可能很重要,尤其是他们在不同平台上遇到响应延迟的问题时。 然后,用户可能需要示例代码来理解如何使用这两个事件。比如,在template中分别用@click@tap绑定方法,然后在方法中处理事件。同时,可以给出阻止冒泡阻止默认行为的例子,说明修饰符的用法。 还需要注意,在Uniapp中推荐使用tap,因为它更适合移动端,尤其是在小程序中。而click可能在H5端有更好的兼容性,但需要注意300ms延迟的问题。用户可能需要根据目标平台选择合适的事件,或者利用Uniapp的跨平台特性统一使用tap。 最后,总结两者的区别使用场景,强调tap的优势click的注意事项,帮助用户做出合适的选择。同时提醒他们查阅官方文档,确保信息的准确性。</think>在Uniapp中,`tap``click`都是用于处理用户点击行为的事件,但它们的底层实现应用场景有所不同。以下是逐步解析: --- ### 1. **基础概念** - **`click`** 是Web端的原生点击事件,属于标准DOM事件。在移动端可能存在 **300ms延迟**(用于区分单击双击)。 ```html <view @click="handleClick">点击我(Web行为)</view> ``` - **`tap`** 是小程序规范中的轻触事件,无延迟,专为移动端优化。Uniapp封装了`@tap`以实现跨平台兼容。 ```html <view @tap="handleTap">轻触我(移动端优化)</view> ``` --- ### 2. **核心区别** | 特性 | `click` | `tap` | |--------------------|--------------------------|--------------------------| | 延迟 | 移动端默认300ms | 无延迟 | | 适用平台 | 主要用于H5 | 所有平台(Uniapp封装) | | 事件冒泡 | 支持 | 支持 | | 底层实现 | DOM事件 | 触摸事件(如`touchstart`+`touchend`) | --- ### 3. **性能与体验** - **移动端优先用`tap`** 若需快速响应(如按钮点击),优先使用`@tap`,避免300ms延迟影响用户体验。 - **H5端的特殊处理** 在H5平台,Uniapp会将`@tap`编译为`click`事件。若需消除延迟,可在`manifest.json`中配置: ```json "h5": { "tapDelay": 0 // 关闭延迟 } ``` --- ### 4. **兼容性写法** Uniapp推荐统一使用`@tap`,因其内部已处理多端差异。例如: - 微信小程序:编译为`bindtap` - H5:编译为`click`(自动处理延迟) - App:编译为原生触摸事件 --- ### 5. **事件修饰符** 两者均支持Vue事件修饰符: ```html <!-- 阻止冒泡 --> <view @tap.stop="doSomething"></view> <view @click.stop="doSomething"></view> <!-- 阻止默认行为 --> <form @submit.prevent="handleSubmit"></form> ``` --- ### 6. **使用建议** - **通用场景** 优先使用`@tap`,尤其是需要跨平台兼容时。 - **H5复杂交互** 若需兼容PC端鼠标操作,可结合`@click`使用。 - **注意点** 避免在同一元素同时绑定`@tap``@click`,可能导致重复触发。 --- ### 总结 $$ \text{选择策略} = \begin{cases} \text{纯移动端} & \Rightarrow @tap \\ \text{H5需兼容PC} & \Rightarrow @click \\ \text{不确定平台} & \Rightarrow @tap + Uniapp跨端适配 \end{cases} $$ 通过理解底层机制平台差异,可更高效地处理用户交互行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值