這篇文章主要介紹移動(dòng)web開(kāi)發(fā)之touch事件的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)制作的專業(yè)網(wǎng)站制作公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁(yè)設(shè)計(jì)人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹(shù)立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來(lái)曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)1000多家。前面的話
iOS版Safari為了向開(kāi)發(fā)人員傳達(dá)一些特殊信息,新增了一些專有事件。因?yàn)閕OS設(shè)備既沒(méi)有鼠標(biāo)也沒(méi)有鍵盤,所以在為移動(dòng)Safari開(kāi)發(fā)交互性網(wǎng)頁(yè)時(shí),常規(guī)的鼠標(biāo)和鍵盤事件根本不夠用。隨著Android 中的WebKit的加入,很多這樣的專有事件變成了事實(shí)標(biāo)準(zhǔn),導(dǎo)致W3C開(kāi)始制定Touch Events規(guī)范。
概述
包含iOS 2.0軟件的iPhone 3G發(fā)布時(shí),也包含了一個(gè)新版本的Safari瀏覽器。這款新的移動(dòng)Safari提供了一些與觸摸(touch)操作相關(guān)的新事件。后來(lái),Android上的瀏覽器也實(shí)現(xiàn)了相同的事件。觸摸事件會(huì)在用戶手指放在屏幕上面時(shí)、在屏幕上滑動(dòng)時(shí)或從屏幕上移開(kāi)時(shí)觸發(fā)。具體來(lái)說(shuō),有以下幾個(gè)觸摸事件
touchstart:當(dāng)手指觸摸屏幕時(shí)觸發(fā);即使已經(jīng)有一個(gè)手指放在了屏幕上也會(huì)觸發(fā) touchmove:當(dāng)手指在屏幕上滑動(dòng)時(shí)連續(xù)地觸發(fā)。在這個(gè)事件發(fā)生期間,調(diào)用preventDefault()可以阻止?jié)L動(dòng) touchend:當(dāng)手指從屏幕上移開(kāi)時(shí)觸發(fā) touchcancel:當(dāng)系統(tǒng)停止跟蹤觸摸時(shí)觸發(fā)(不常用)。關(guān)于此事件的確切觸發(fā)時(shí)間,文檔中沒(méi)有明確說(shuō)明
【touchenter 和 touchleave】
觸摸事件規(guī)范中曾經(jīng)包含touchenter和touchleave事件,這兩個(gè)事件在用戶手指移入或移出某個(gè)元素時(shí)觸發(fā)。但是這兩個(gè)事件從來(lái)沒(méi)有被實(shí)現(xiàn)。微軟有這兩個(gè)事件的替代事件,但是只有IE瀏覽器支持。某些情況下可以知道用戶手指滑入滑出某個(gè)元素是素是非常有用的,所以希望這兩個(gè)事件可以重返規(guī)范
在觸摸事件中,常用的是touchstart、touchumove和touchend這三個(gè)事件,與鼠標(biāo)事件的對(duì)應(yīng)如下
鼠標(biāo) 觸摸 mousedown touchstart mousemove touchmove mouseup touchend
[注意]touch事件在chrome模擬器下部分版本使用DOM0級(jí)事件處理程序的方式來(lái)添加事件無(wú)效
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> #test{height:200px;width:200px;background:lightblue;} </style> </head> <body> <div id="test"></div> <script> (function(){ var stateMap = { touchstart_index : 0, touchmove_index : 0, touchend_index : 0 }, elesMap = { touch_obj: document.getElementById('test') }, showIndex, handleTouch; showIndex = function ( type ) { elesMap.touch_obj.innerHTML = type + ':' + (++stateMap[type + '_index']); }; handleTouch = function ( event ) { showIndex( event.type ); }; elesMap.touch_obj.addEventListener('touchstart', function(event){handleTouch(event);}); elesMap.touch_obj.addEventListener('touchmove', function(event){handleTouch(event);}); elesMap.touch_obj.addEventListener('touchend', function(event){handleTouch(event);}); })(); </script> </body> </html>
300ms
300ms問(wèn)題是指在某個(gè)元素執(zhí)行它的功能和執(zhí)行touch事件之間有一個(gè)300毫秒的間隔。鼠標(biāo)事件、焦點(diǎn)事件、瀏覽器默認(rèn)行為等相較于touch事件,都存在著300ms的延遲
【點(diǎn)透】
因?yàn)?00ms的存在,會(huì)造成常見(jiàn)的點(diǎn)透問(wèn)題。先來(lái)看例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> #test {position: absolute;top: 0;left: 0;opacity: 0.5;height: 200px;width: 200px;background: lightblue;} </style> </head> <body> <a href="https://baidu.com">百度</a> <div id="test"></div> <script> (function () { var elesMap = { touchObj: document.getElementById('test') }, fnHide, onTouch; fnHide = function (type) { elesMap.touchObj.style.display = 'none'; }; onTouch = function (event) { fnHide(); }; elesMap.touchObj.addEventListener('touchstart', function(event){onTouch(event);}); })(); </script> </body> </html>
淺藍(lán)色的半透明div被點(diǎn)擊(觸發(fā)touch事件)后,如果點(diǎn)擊位置正好位于鏈接的上方,則會(huì)觸發(fā)鏈接跳轉(zhuǎn)的默認(rèn)行為。詳細(xì)解釋是,點(diǎn)擊頁(yè)面后,瀏覽器會(huì)記錄所點(diǎn)擊的頁(yè)面坐標(biāo),300ms后,在該坐標(biāo)找到元素。在該元素上觸發(fā)點(diǎn)擊行為。因此,如果300ms內(nèi)同一頁(yè)面坐標(biāo)的上層元素消失后,300ms后在下層元素上觸發(fā)點(diǎn)擊行為。這就造成了點(diǎn)透問(wèn)題
造成這個(gè)問(wèn)題,是因?yàn)橛|摸屏幕的行為被重載(overload)了。在手指觸摸屏幕的瞬間,瀏覽器無(wú)法預(yù)知用戶是在輕觸(Tap)、雙觸(Double-Tap)、滑動(dòng)(Swipe)、按住不放(Hold)還是其他什么操作。唯一保險(xiǎn)的做法就是等上一會(huì)兒看接下來(lái)會(huì)發(fā)生什么
問(wèn)題是在于雙觸(Double-Tap)。即便是瀏覽器檢測(cè)出手指離開(kāi)了屏幕,它仍然無(wú)法判斷接下來(lái)做什么。因?yàn)闉g覽器無(wú)法知道手指是會(huì)再次回到屏幕,還是就此結(jié)束觸發(fā)輕觸事件以及事件級(jí)聯(lián)。為了確定這一點(diǎn),瀏覽器不得不等待一小段時(shí)間。瀏覽器開(kāi)發(fā)者找到一個(gè)最佳時(shí)間間隔,就是300毫秒
【解決辦法】
1、在touch事件的事件處理程序中增加300ms的延遲
(function () { var elesMap = { touchObj: document.getElementById('test') }, fnHide, onTouch; fnHide = function (type) { elesMap.touchObj.style.display = 'none'; }; onTouch = function (event) { setTimeout(function(){ fnHide(); },300); }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })();
2、使用緩動(dòng)動(dòng)畫,增加300ms的過(guò)渡效果,注意display屬性無(wú)法使用transition
3、加入中間層的dom元素,讓中間層接受這個(gè)穿透事件,稍后隱藏
4、上下兩級(jí)都使用tap事件,但默認(rèn)行為不可避免
5、在document上的touchstart事件,阻止默認(rèn)行為。
document.addEventListener('touchstart',function(e){ e.preventDefault(); })
接著,添加a標(biāo)簽的跳轉(zhuǎn)行為
a.addEventListener('touchstart',function(){ window.location.href = 'https://cnblogs.com'; })
但是,這種方法有副作用,會(huì)造成頁(yè)面無(wú)法滾動(dòng)、文本無(wú)法選中等。如果在某個(gè)元素上,需要恢復(fù)文本選中的行為,則可以使用阻止冒泡來(lái)恢復(fù)
el.addEventListener('touchstart',function(e){ e.stopPropagation(); })
事件對(duì)象
【基礎(chǔ)信息】
每個(gè)觸摸事件的event對(duì)象都提供了在鼠標(biāo)事件中常見(jiàn)的屬性,包括事件類型、事件目標(biāo)對(duì)象、事件冒泡、事件流、默認(rèn)行為等
以touchstart為例,示例代碼如下
<script> (function () { var elesMap = { touchObj: document.getElementById('test') }, onTouch; onTouch = function (e) { console.log(e) }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })(); </script>
1、currentTarget屬性返回事件正在執(zhí)行的監(jiān)聽(tīng)函數(shù)所綁定的節(jié)點(diǎn)
2、target屬性返回事件的實(shí)際目標(biāo)節(jié)點(diǎn)
3、srcElement屬性與target屬性功能一致
//當(dāng)前目標(biāo) currentTarget:[object HTMLDivElement] //實(shí)際目標(biāo) target:[object HTMLDivElement] //實(shí)際目標(biāo) srcElement:[object HTMLDivElement]
4、eventPhase屬性返回一個(gè)整數(shù)值,表示事件目前所處的事件流階段。0表示事件沒(méi)有發(fā)生,1表示捕獲階段,2表示目標(biāo)階段,3表示冒泡階段
5、bubbles屬性返回一個(gè)布爾值,表示當(dāng)前事件是否會(huì)冒泡。該屬性為只讀屬性
6、cancelable屬性返回一個(gè)布爾值,表示事件是否可以取消。該屬性為只讀屬性
//事件流 eventPhase: 2 //可冒泡 bubbles: true //默認(rèn)事件可取消 cancelable: true
【touchList】
除了常見(jiàn)的DOM屬性外,觸摸事件對(duì)象有一個(gè)touchList數(shù)組屬性,其中包含了每個(gè)觸摸點(diǎn)的信息。如果用戶使用四個(gè)手指觸摸屏幕,這個(gè)數(shù)組就會(huì)有四個(gè)元素。一共有三個(gè)這樣的數(shù)組
1、touches:當(dāng)前觸摸屏幕的觸摸點(diǎn)數(shù)組(至少有一個(gè)觸摸在事件目標(biāo)元素上)
2、changedTouches :導(dǎo)致觸摸事件被觸發(fā)的觸摸點(diǎn)數(shù)組
3、targetTouches:事件目標(biāo)元素上的觸摸點(diǎn)數(shù)組
如果用戶最后一個(gè)手指離開(kāi)屏幕觸發(fā)touchend事件,這最后一個(gè)觸摸點(diǎn)信息不會(huì)出現(xiàn)在targetTouches和touches數(shù)組中,但是會(huì)出現(xiàn)在changedTouched數(shù)組中。因?yàn)槭撬碾x開(kāi)觸發(fā)了touchend事件,所以changedTouches數(shù)組中仍然包含它。上面三個(gè)數(shù)組中,最常用的是changedTouches數(shù)組
(function () { var elesMap = { touchObj: document.getElementById('test') }, onTouch; onTouch = function (e) { elesMap.touchObj.innerHTML = 'touches:' + e.touches.length + '<br>changedTouches:' + e.changedTouches.length + '<br>targetTouches:' + e.targetTouches.length; }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })();
【事件坐標(biāo)】
上面這些觸摸點(diǎn)數(shù)組中的元素可以像普通數(shù)組那樣用數(shù)字索引。數(shù)組中的元素包含了觸摸點(diǎn)的有用信息,尤其是坐標(biāo)信息。每個(gè)Touch對(duì)象包含下列屬性
clientx:觸摸目標(biāo)在視口中的x坐標(biāo) clientY:觸摸目標(biāo)在視口中的y坐標(biāo) identifier:標(biāo)識(shí)觸摸的唯一ID pageX:觸摸目標(biāo)在頁(yè)面中的x坐標(biāo)(包含滾動(dòng)) pageY:觸摸目標(biāo)在頁(yè)面中的y坐標(biāo)(包含滾動(dòng)) screenX:觸摸目標(biāo)在屏幕中的x坐標(biāo) screenY:觸摸目標(biāo)在屏幕中的y坐標(biāo) target:觸摸的DOM節(jié)點(diǎn)目標(biāo)
changedTouches數(shù)組中的第一個(gè)元素就是導(dǎo)致事件觸發(fā)的那個(gè)觸摸點(diǎn)對(duì)象(通常這個(gè)觸摸點(diǎn)數(shù)組不包含其他對(duì)象)。這個(gè)觸摸點(diǎn)對(duì)象含有clientX/Y和pageX/Y坐標(biāo)信息。除此之外還有screenX/Y和x/y,這些坐標(biāo)在瀏覽器間不太一致,不建議使用
clientX/Y和pageX/Y的區(qū)別在于前者相對(duì)于視覺(jué)視口的左上角,后者相對(duì)于布局視口的左上角。布局視口是可以滾動(dòng)的
(function () { var elesMap = { touchObj: document.getElementById('test') }, onTouch; onTouch = function (e) { var touch = e.changedTouches[0]; elesMap.touchObj.innerHTML = 'clientX:' + touch.clientX + '<br>clientY:' + touch.clientY + '<br>pageX:' + touch.pageX + '<br>pageY:' + touch.pageY + '<br>screenX:' + touch.screenX + '<br>screenY:' + touch.screenY }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })();
以上是“移動(dòng)web開(kāi)發(fā)之touch事件的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:移動(dòng)web開(kāi)發(fā)之touch事件的示例分析-創(chuàng)新互聯(lián)
分享鏈接:http://aaarwkj.com/article28/iedjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、用戶體驗(yàn)、云服務(wù)器、企業(yè)網(wǎng)站制作、做網(wǎng)站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容