解決vue的touchStart事件及click事件沖突問題
一 、問題:
今天遇到這樣問題,給某個元素同時綁定touchStart及click事件后,若在移動設(shè)備上,當(dāng)你點擊時,會依次出發(fā)這兩個事件。因為移動端設(shè)備上的click事件觸發(fā)是會延遲300ms,所以touchStart事件會先觸發(fā)后再觸發(fā)click事件。這樣導(dǎo)致每次都要執(zhí)行兩次,這樣毫無意義。這里提醒下,PC是無法識別touch相關(guān)事件
二、解決方式
(1)preventDefault方法
通過使用preventDefault方法(阻止元素默認(rèn)事件行為的發(fā)生)來解決。在touchstart中添加 e.preventDefault()就可以阻止click事件觸發(fā)。
模板
<ul class='list'> <li v-for='item of letters' :key='item' :ref='item' @touchstart='handleTouchStart' @click='handleleterClick' >{{item}}</li> </ul>
上面模板可以使用vue事件修飾符@touchstart.stop.prevent實現(xiàn),但method中的handleTouchStart 就無需添加 e.preventDefault();
<ul class='list'> <li v-for='item of letters' :key='item' :ref='item' @touchstart.stop.prevent='handleTouchStart' @click='handleleterClick' >{{item}}</li> </ul>
methods: { handleleterClick (e) { console.log(’click事件執(zhí)行一次’) this.$emit(’change’, e.target.innerText) }, handleTouchStart (e) { console.log(’TouchStart執(zhí)行一次’) e.preventDefault()//添加阻止click事件觸發(fā) this.touchStatus = true } }}
未添加 e.preventDefault()前打印結(jié)果

添加 e.preventDefault()后打印結(jié)果

(2)判斷瀏覽器是否支持觸屏事件
通過'ontouchend' in document來判斷瀏覽器是否支持觸屏事件,若支持調(diào)用touch事件,不支持調(diào)用click事件。
<ul class='list'> <li v-for='item of letters' :key='item' :ref='item' @click='handleSelfClick' >{{item}}</li> </ul>
methods: { handleleterClick (e) { console.log(’click事件執(zhí)行一次’) this.$emit(’change’, e.target.innerText) }, handleTouchStart (e) { console.log(’TouchStart執(zhí)行一次’) this.touchStatus = true }, handleSelfClick (e) { console.log(’ontouchstart’ in document)//打印是否支持touch事件。 if (’ontouchstart’ in document) { this.handleTouchStart(e) } else { this.handleleterClick(e) } } }
以上這篇解決vue的touchStart事件及click事件沖突問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ASP基礎(chǔ)知識Command對象講解2. JavaScript實現(xiàn)留言板實戰(zhàn)案例3. 使用Blazor框架實現(xiàn)在前端瀏覽器中導(dǎo)入和導(dǎo)出Excel4. Python使用Selenium自動進(jìn)行百度搜索的實現(xiàn)5. 如何從Python的cmd中獲得.py文件參數(shù)6. python中文本字符處理的簡單方法記錄7. JS中6個對象數(shù)組去重的方法8. PHP laravel實現(xiàn)導(dǎo)出PDF功能9. Python-openpyxl表格讀取寫入的案例詳解10. vscode運行php報錯php?not?found解決辦法

網(wǎng)公網(wǎng)安備