您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何解決JS中touchstart事件與click事件沖突的問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
前言
移動互聯網是未來的發展趨勢,現在國內很多互聯網大佬都在爭取移動這一塊大餅,如微信及支付寶是目前比較成功的例子,當然還有各種APP和web運用。
一 · 業務場景的描述
在對已完成的PC站點進行移動端適配時,我們想要站點在移動設備上有更快的響應速度,以帶給用戶更好的體驗,此時,我們應該使用移動設備專用的事件系統,例如,使用 touchstart 事件代替 click 事件。
為什么這樣效果會更好呢?根據Google開發者文檔中的描述:
移動設備上的瀏覽器將會在 click 事件觸發時延遲 300ms ,以確保這是一個“單擊”事件而非“雙擊”事件。
而對于 touchstart 事件而言,則會在用戶手指觸碰屏幕的一瞬間觸發所綁定的事件。所以,使用 touchstart 替換 click 事件的意義在于,幫助用戶在每次點擊時節省 300ms 的時間。在頁面頻繁需要點擊,或者點擊發生在動畫中,對動畫流暢度有較高要求的情境下,使用這種技術是非常必要的。
但是,讓我們回到我們的初始場景,在 PC端站點適配移動端時 我們不能簡單的進行 touchstart和 click 事件的替換,因為PC并不能識別 touchstart 事件。
二 · 產生沖突的原因
當然,我們可以給某個元素同時綁定 touchstart 和 click 事件,但這將會導致本篇文章解決的問題 -- 這兩個事件在移動設備上會發生沖突。
由于移動設備能夠同時識別 touchstart 和 click 事件,因此當用戶點擊目標元素時,綁定在目標元素上的 touchstart 事件與 click 事件(約300ms后)會依次被觸發,也就是說,我們所綁定的回調函數會被執行兩次!。這顯然不是我們想要的結果。
三 · 解決方案
針對這樣的情境,有以下兩種解決方案:
(一)使用 preventDefault
第一種解決方案是使用事件對象中的 preventDefault 方法,preventDefault 方法的作用在于:阻止元素默認事件行為的發生,但有意思的是,當我們在目標元素同時綁定 touchstart 和 click 事件時,在 touchstart 事件回調函數中使用該方法,可以阻止后續 click 事件的發生。
這從道理上是講不通的,畢竟,我們添加的 click 事件并不是元素的“默認事件”,但它確實奏效了,或者說,被瀏覽器實現了,因此我們可以使用該方法解決移動設備上 touchstart 事件與 click 事件的沖突問題,具體代碼如下:
const Button = document.getElementById("targetButton") Button.addEventListener("touchstart", e => { e.preventDefault() console.log("touchstart event!") }) Button.addEventListener("click", e => { e.preventDefault() console.log("click event!") })
當你在瀏覽器上模擬移動設備后點擊目標元素,只會在控制臺看到 touchstart event! 字段,很顯然,click 事件被成功阻止了。
總結
使用該方法的優點在于簡單粗暴,直接有效,能夠很好的實現我們的目標,但缺點在于, preventDefault 方法為阻止 click 事件的方式是瀏覽器實現上的,而不是 preventDefault 原理上的,這會帶來一些不確定性,雖然我暫時尚未發現該方法失效的具體場景。
(二)基于功能檢測綁定事件
我們可以通過判斷瀏覽器是否支持 touchstart 事件來封裝元素的點擊事件,這樣客戶端會根據當前環境判定元素應該綁定的事件類型,代碼如下:
const Button = document.getElementById("targetButton") const clickEvent = (function() { if ('ontouchstart' in document.documentElement === true) return 'touchstart'; else return 'click'; })(); Button.addEventListener(clickEvent, e => { console.log("things happened!") })
感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何解決JS中touchstart事件與click事件沖突的問題”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。