溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

vue的touchStart事件及click事件沖突的解決方案

發(fā)布時間:2020-07-21 17:44:51 來源:億速云 閱讀:1147 作者:小豬 欄目:開發(fā)技術(shù)

這篇文章主要講解了vue的touchStart事件及click事件沖突的解決方案,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

一 、問題:

今天遇到這樣問題,給某個元素同時綁定touchStart及click事件后,若在移動設(shè)備上,當(dāng)你點擊時,會依次出發(fā)這兩個事件。因為移動端設(shè)備上的click事件觸發(fā)是會延遲300ms,所以touchStart事件會先觸發(fā)后再觸發(fā)click事件。這樣導(dǎo)致每次都要執(zhí)行兩次,這樣毫無意義。這里提醒下,PC是無法識別touch相關(guān)事件

二、解決方式

(1)preventDefault方法

通過使用preventDefault方法(阻止元素默認事件行為的發(fā)生)來解決。在touchstart中添加 e.preventDefault()就可以阻止click事件觸發(fā)。

模板

 <ul class="list">
 <li class="item" 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 class="item" 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é)果

vue的touchStart事件及click事件沖突的解決方案

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

vue的touchStart事件及click事件沖突的解決方案

(2)判斷瀏覽器是否支持觸屏事件

通過"ontouchend" in document來判斷瀏覽器是否支持觸屏事件,若支持調(diào)用touch事件,不支持調(diào)用click事件。

 <ul class="list">
 <li class="item" 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)
  }
 }
 }

看完上述內(nèi)容,是不是對vue的touchStart事件及click事件沖突的解決方案有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI