博客
关于我
vue的touchStart事件及click事件冲突问题
阅读量:539 次
发布时间:2019-03-08

本文共 1166 字,大约阅读时间需要 3 分钟。

遇到一个问题:在移动设备上,当你点击元素时,touchStart和click事件会依次触发。由于click事件在移动端有300ms延迟,导致touchStart先触发,随后click事件再被触发,这种情况会导致每次操作执行两次毫无意义的代码。此外,PC端无法识别touch相关事件。

为了解决这个问题,可以采取以下两种方式:

(1)使用preventDefault方法

通过在touchstart事件中添加e.preventDefault(),可以阻止click事件的触发。这种方法在Vue框架中可以通过事件修饰符@touchstart.stop.prevent实现。在method中不需要手动添加e.preventDefault(),只需在触发touchStart事件时调用阻止默认行为即可。

示例代码:

  • {{ item }}
methods: {  handleLetterClick(e) {    console.log('click事件执行一次');    this.$emit('change', e.target.innerText);  },  handleTouchStart(e) {    console.log('TouchStart执行一次');    this.touchStatus = true;    e.preventDefault(); // 在method中无需手动添加  }}

(2)判断浏览器是否支持触屏事件

可以通过检查'ontouchstart' in document来判断浏览器是否支持触屏事件。如果支持touch事件,则调用touchStart事件处理逻辑;如果不支持,直接调用click事件。

示例代码:

  • {{ item }}
methods: {  handleLetterClick(e) {    console.log('click事件执行一次');    this.$emit('change', e.target.innerText);  },  handleTouchStart(e) {    console.log('ontouchstart' in document);    if ('ontouchstart' in document) {      this.handleTouchStart(e);    } else {      this.handleLetterClick(e);    }  },  handleSelfClick(e) {    // 可以根据需要添加额外逻辑  }}

通过上述方法,可以有效避免在移动设备上触发不必要的click事件,从而优化用户体验。

转载地址:http://cgpiz.baihongyu.com/

你可能感兴趣的文章
Openlayers实战:modifystart、modifyend互动示例
查看>>
Openlayers实战:判断共享单车是否在电子围栏内
查看>>
Openlayers实战:加载Bing地图
查看>>
Openlayers实战:加载GeoJSON
查看>>
Openlayers实战:加载SHP文件
查看>>
Openlayers实战:界面控制综合演示
查看>>
Openlayers实战:绘制图形,导出geojson文件
查看>>
Openlayers实战:绘制图形,导出KML文件
查看>>
Openlayers实战:绘制多边形,导出CSV文件
查看>>
Openlayers实战:绘制带箭头的线
查看>>
Openlayers实战:绘制矩形,正方形,正六边形
查看>>
Openlayers实战:自定义放大缩小,显示zoom等级
查看>>
Openlayers实战:自定义版权属性信息
查看>>
Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
查看>>
Openlayers实战:选择feature,列表滑动,定位到相应的列表位置
查看>>
Openlayers实战:非4326,3857的投影
查看>>
Openlayers高级交互(1/20): 控制功能综合展示(版权、坐标显示、放缩、比例尺、测量等)
查看>>
Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
查看>>
Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
查看>>
Openlayers高级交互(12/20):利用高德逆地理编码,点击位置,显示坐标和地址
查看>>