您好,登錄后才能下訂單哦!
這篇文章主要講解了vue的touchStart事件及click事件沖突的解決方案,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
一 、問題:
今天遇到這樣問題,給某個元素同時綁定touchStart及click事件后,若在移動設備上,當你點擊時,會依次出發這兩個事件。因為移動端設備上的click事件觸發是會延遲300ms,所以touchStart事件會先觸發后再觸發click事件。這樣導致每次都要執行兩次,這樣毫無意義。這里提醒下,PC是無法識別touch相關事件
二、解決方式
(1)preventDefault方法
通過使用preventDefault方法(阻止元素默認事件行為的發生)來解決。在touchstart中添加 e.preventDefault()就可以阻止click事件觸發。
模板
<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實現,但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事件執行一次') this.$emit('change', e.target.innerText) }, handleTouchStart (e) { console.log('TouchStart執行一次') e.preventDefault()//添加阻止click事件觸發 this.touchStatus = true } } }
未添加 e.preventDefault()前打印結果
添加 e.preventDefault()后打印結果
(2)判斷瀏覽器是否支持觸屏事件
通過"ontouchend" in document來判斷瀏覽器是否支持觸屏事件,若支持調用touch事件,不支持調用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事件執行一次') this.$emit('change', e.target.innerText) }, handleTouchStart (e) { console.log('TouchStart執行一次') 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事件沖突的解決方案有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。