如何解決JS中touchstart事件與click事件沖突的問題-創(chuàng)新互聯(lián)

這篇文章主要介紹了如何解決JS中touchstart事件與click事件沖突的問題,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的安丘網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

前言

移動(dòng)互聯(lián)網(wǎng)是未來的發(fā)展趨勢,現(xiàn)在國內(nèi)很多互聯(lián)網(wǎng)大佬都在爭取移動(dòng)這一塊大餅,如微信及支付寶是目前比較成功的例子,當(dāng)然還有各種APP和web運(yùn)用。

一 · 業(yè)務(wù)場景的描述

在對已完成的PC站點(diǎn)進(jìn)行移動(dòng)端適配時(shí),我們想要站點(diǎn)在移動(dòng)設(shè)備上有更快的響應(yīng)速度,以帶給用戶更好的體驗(yàn),此時(shí),我們應(yīng)該使用移動(dòng)設(shè)備專用的事件系統(tǒng),例如,使用 touchstart 事件代替 click 事件。

為什么這樣效果會(huì)更好呢?根據(jù)Google開發(fā)者文檔中的描述:

移動(dòng)設(shè)備上的瀏覽器將會(huì)在 click 事件觸發(fā)時(shí)延遲 300ms ,以確保這是一個(gè)“單擊”事件而非“雙擊”事件。
而對于 touchstart 事件而言,則會(huì)在用戶手指觸碰屏幕的一瞬間觸發(fā)所綁定的事件。所以,使用 touchstart 替換 click 事件的意義在于,幫助用戶在每次點(diǎn)擊時(shí)節(jié)省 300ms 的時(shí)間。在頁面頻繁需要點(diǎn)擊,或者點(diǎn)擊發(fā)生在動(dòng)畫中,對動(dòng)畫流暢度有較高要求的情境下,使用這種技術(shù)是非常必要的。

但是,讓我們回到我們的初始場景,在 PC端站點(diǎn)適配移動(dòng)端時(shí) 我們不能簡單的進(jìn)行 touchstart和 click 事件的替換,因?yàn)镻C并不能識別 touchstart 事件。

二 · 產(chǎn)生沖突的原因

當(dāng)然,我們可以給某個(gè)元素同時(shí)綁定 touchstart 和 click 事件,但這將會(huì)導(dǎo)致本篇文章解決的問題 -- 這兩個(gè)事件在移動(dòng)設(shè)備上會(huì)發(fā)生沖突。

由于移動(dòng)設(shè)備能夠同時(shí)識別 touchstart 和 click 事件,因此當(dāng)用戶點(diǎn)擊目標(biāo)元素時(shí),綁定在目標(biāo)元素上的 touchstart 事件與 click 事件(約300ms后)會(huì)依次被觸發(fā),也就是說,我們所綁定的回調(diào)函數(shù)會(huì)被執(zhí)行兩次!。這顯然不是我們想要的結(jié)果。

三 · 解決方案

針對這樣的情境,有以下兩種解決方案:

(一)使用 preventDefault

第一種解決方案是使用事件對象中的 preventDefault 方法,preventDefault 方法的作用在于:阻止元素默認(rèn)事件行為的發(fā)生,但有意思的是,當(dāng)我們在目標(biāo)元素同時(shí)綁定 touchstart 和 click 事件時(shí),在 touchstart 事件回調(diào)函數(shù)中使用該方法,可以阻止后續(xù) click 事件的發(fā)生。

這從道理上是講不通的,畢竟,我們添加的 click 事件并不是元素的“默認(rèn)事件”,但它確實(shí)奏效了,或者說,被瀏覽器實(shí)現(xiàn)了,因此我們可以使用該方法解決移動(dòng)設(shè)備上 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!")
})

當(dāng)你在瀏覽器上模擬移動(dòng)設(shè)備后點(diǎn)擊目標(biāo)元素,只會(huì)在控制臺看到 touchstart event! 字段,很顯然,click 事件被成功阻止了。

總結(jié)

使用該方法的優(yōu)點(diǎn)在于簡單粗暴,直接有效,能夠很好的實(shí)現(xiàn)我們的目標(biāo),但缺點(diǎn)在于, preventDefault 方法為阻止 click 事件的方式是瀏覽器實(shí)現(xiàn)上的,而不是 preventDefault 原理上的,這會(huì)帶來一些不確定性,雖然我暫時(shí)尚未發(fā)現(xiàn)該方法失效的具體場景。

(二)基于功能檢測綁定事件

我們可以通過判斷瀏覽器是否支持 touchstart 事件來封裝元素的點(diǎn)擊事件,這樣客戶端會(huì)根據(jù)當(dāng)前環(huán)境判定元素應(yīng)該綁定的事件類型,代碼如下:

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!")
})

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何解決JS中touchstart事件與click事件沖突的問題”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司,關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計(jì)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁題目:如何解決JS中touchstart事件與click事件沖突的問題-創(chuàng)新互聯(lián)
分享路徑:http://bm7419.com/article8/ddpjop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站改版虛擬主機(jī)、定制網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站