摘要:在中與值是相等的,在微信中兩個數(shù)值不等,但單位應(yīng)該也不一樣。測試過程中及微信內(nèi)置瀏覽器都不支持這些屬性,模擬器可以。也是一個對象,對于事件這個對象列出在此次事件中新增加的觸點(diǎn)。
本文主要介紹 TouchEvent 相關(guān)的一些對象與屬性如 Touch, TouchList, touhces, targetTouches 等,以及使用的注意點(diǎn)和誤區(qū)。
觸摸事件有以下幾種類型:touchstart,touchmove,touchend這三種用的比較多,還有不常用的touchcancel事件。當(dāng)然 MDN上還介紹了touchenter,touchleave事件,具體適用的場景及兼容性如何還未做測試,感興趣的可自行研究。
js中不同的事件類型,event對象包含的屬性也有所差異。我們先了解幾個TouchEvent涉及的對象。
提示:文中的demo都是在 chrome 模擬器,iPhone6s(iOS9.3.2) safari,iOS微信上運(yùn)行,安卓的兼容性未做測試
TouchTouch對象代表一個觸點(diǎn),可以通過event.touches[0]獲取,每個觸點(diǎn)包含位置,大小,形狀,壓力大小,和目標(biāo) element屬性。
{ screenX: 511, screenY: 400,//觸點(diǎn)相對于屏幕左邊沿的Y坐標(biāo) clientX: 244.37899780273438, clientY: 189.3820037841797,//相對于可視區(qū)域 pageX: 244.37, pageY: 189.37,//相對于HTML文檔頂部,當(dāng)頁面有滾動的時候與clientX=Y 不等 force: 1,//壓力大小,是從0.0(沒有壓力)到1.0(最大壓力)的浮點(diǎn)數(shù) identifier: 1036403715,//一次觸摸動作的唯一標(biāo)識符 radiusX: 37.565673828125, //能夠包圍用戶和觸摸平面的接觸面的最小橢圓的水平軸(X軸)半徑 radiusY: 37.565673828125, rotationAngle: 0,//它是這樣一個角度值:由radiusX 和 radiusY 描述的正方向的橢圓,需要通過順時針旋轉(zhuǎn)這個角度值,才能最精確地覆蓋住用戶和觸摸平面的接觸面 target: {} // 此次觸摸事件的目標(biāo)element }
identifier
這個屬性大家可能有疑惑,使用 Chrome 的模擬器發(fā)現(xiàn)多次觸摸動作,值始終不變。用真機(jī)測試則不會有問題(我這里用的safari連接mac調(diào)試)。每次觸摸包括start,move,end這整個過程,標(biāo)志符都不變。下一次觸摸動作開始,標(biāo)志符就會變化。
screenY clientY
在 safari 中 screenY與clientY值是相等的,在iOS微信中兩個數(shù)值不等,但單位應(yīng)該也不一樣。
radiusX radiusY rotationAngle
測試過程中safari及微信內(nèi)置瀏覽器都不支持這些屬性,chrome模擬器可以。
由Touch對象構(gòu)成的數(shù)組,通過event.touches取到。一個Touch對象代表一個觸點(diǎn),當(dāng)有多個手指觸摸屏幕時,TouchList就會存儲多個Touch對象,前面說到的identifier就用來區(qū)分每個手指對應(yīng)的Touch對象。
TouchEventTouchEvent就是用來描述手指觸摸屏幕的狀態(tài)變化事件,除了一般DOM事件中event對像具備的屬性,還有一些特有的屬性。
touches一個TouchList對象,包含當(dāng)前所有接觸屏幕的觸點(diǎn)的Touch對象,不論 touchstart 事件從哪個elment上觸發(fā)。
targetTouches也是一個TouchList對象,包含了如下觸點(diǎn)的 Touch 對象:touchstart從當(dāng)前事件的目標(biāo)element上觸發(fā)
這里大家可能產(chǎn)生了疑惑,這兩個對象到底有什么區(qū)別?尤其是我們使用chrome模擬器中運(yùn)行 demo,打印兩個對象發(fā)現(xiàn)他們其實(shí)是一樣的。
這兩個對象的區(qū)別可以類比event.target與event.currentTarget 的區(qū)別,如果以前沒留意,自行 js 高級程序設(shè)計。
我們先看一個 demo2,來了解 touch 事件的特性。
在線編輯: http://jsrun.net/3XKKp
預(yù)覽地址: http://jsrun.net/rtd/3XKKp
大家進(jìn)行以下兩個操作,觀察控制臺發(fā)現(xiàn)了什么?
操作一:一根手指觸摸藍(lán)色box,并滑動,繼續(xù)滑動出藍(lán)色box
操作二:一根手指觸摸非藍(lán)色box區(qū)域,然后慢慢滑動到藍(lán)色box
大家會發(fā)現(xiàn):操作一中即使滑出藍(lán)色box,而touchmove,touchend事件會繼續(xù)觸發(fā),touches,targetTouches存儲著相同的 Touch 對象,touchmove事件的目標(biāo)元素仍然是box。
操作二中相關(guān)的 touch 事件都不會觸發(fā)。很神奇的是 touchmove 事件,明明在 box 上滑動,卻不會觸發(fā) touchmove 事件。
我們可以猜測,touch相關(guān)的事件是一個整體,一開始touchstart不可能被觸發(fā),則后續(xù)touch事件也不會被觸發(fā)。當(dāng)然你可以不監(jiān)聽 touchstart 事件,按照操作一 touchmove,touchend 還是可以觸發(fā)的。
再看下面這個demo2
在線編輯:http://jsrun.net/XXKKp
訪問地址:http://jsrun.net/rtd/XXKKp
這里我們對白色區(qū)域body也添加了 touch 事件的監(jiān)聽,繼續(xù)上述 demo1中的兩個操作。
我們可以發(fā)現(xiàn):
操作一可以發(fā)現(xiàn):touch 相關(guān)的事件可以冒泡,觸發(fā)了 box,body的touch事件。操作二只能觸發(fā) body 的touch 事件,和demo1同理。
我們可以觀察下操作一的兩個對象TouchEvent.targetTouches,TouchEvent.touches,無論是box還是body觸發(fā)的 touch 事件,他們的存儲的 Touch對象都是相同的,而且 target 都是 box。
接下來進(jìn)行操作三:
用兩根手指,一根手指觸摸藍(lán)色box,另一根觸摸白色區(qū)域,然后滑動。
然后再次比較下targetTouches和touches,就可以發(fā)現(xiàn)他們的不同。
changedTouches也是一個 TouchList 對象,對于 touchstart 事件, 這個 TouchList 對象列出在此次事件中新增加的觸點(diǎn)。對于 touchmove 事件,列出和上一次事件相比較,發(fā)生了變化的觸點(diǎn)。對于 touchend ,列出離開觸摸平面的觸點(diǎn)(這些觸點(diǎn)對應(yīng)已經(jīng)不接觸觸摸平面的手指)。
touchend這里要特別注意,touches和targetTouches只存儲接觸屏幕的觸點(diǎn),要獲取觸點(diǎn)最后離開的狀態(tài)要使用changedTouches。
之前也經(jīng)常用touches[0]來獲取Touch 對象,如果知道了 touches,targetTouches,changedTouches 的不同之處。在編寫代碼時可以更好的選擇使用,程序也可以更嚴(yán)謹(jǐn)。
續(xù)篇想研究的問題:
touchmove的觸發(fā)頻率問題
如何判定用戶是快速滑動(swipe事件)
如何實(shí)現(xiàn)Tap
一些使用總結(jié)或最佳實(shí)踐
參考資料MDN: https://developer.mozilla.org/zh-CN/docs/Web/API/TouchEvent
js高級程序設(shè)計
文中如理解有誤,還請多多指出!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79599.html
摘要:單點(diǎn)手勢庫分析手勢是什么有哪些方法實(shí)現(xiàn)首先我這里指的手勢是指我們在移動端進(jìn)行觸屏交互的時候,用戶操作的一些手勢??梢钥吹刂房偨Y(jié)這是我挺久之前做的移動端單點(diǎn)手勢庫個人博客地址學(xué)習(xí)時參考劇中人 單點(diǎn)手勢庫 分析 手勢是什么? 有哪些方法實(shí)現(xiàn)? 首先我這里指的手勢是指我們在移動端進(jìn)行觸屏交互的時候,用戶操作的一些手勢。在我們在移動端需要一些交互的時候。難免有時候需要左滑右滑。 目前市面...
摘要:需求移動實(shí)現(xiàn)手指觸摸移動物體端實(shí)現(xiàn)鼠標(biāo)拖拽物體實(shí)現(xiàn)移動端通過和事件實(shí)現(xiàn)時記錄手指按下的位置為為了方便描述移動時中獲取移動過程中的位置為計算此次移動的距離正或者負(fù),將移動物體的絕對位置更新原始位置加上移動距離,更新的值。進(jìn)入下一次移動事件 需求 移動實(shí)現(xiàn)手指觸摸移動物體 PC端實(shí)現(xiàn)鼠標(biāo)拖拽物體 實(shí)現(xiàn) 移動端 通過touchstart和touchmove事件實(shí)現(xiàn) 1、touchsta...
摘要:二分析排查一步驟一使用搜索引擎我是在無意中發(fā)現(xiàn)該問題的,當(dāng)時觀察到的現(xiàn)象是綁定在上的事件有時會被觸發(fā),有時會失效。這說明并不存在偶爾失效的問題。也就是說,我需要找到確切的令響應(yīng)事件失效的原因。接下來的事很簡單,繼續(xù)搜索事件在頁面滾動后失效。 如果你關(guān)注我應(yīng)該知道,我最近對PC端頁面進(jìn)行移動適配。在這個過程中,為了節(jié)省用戶300ms的時間,同時給予用戶更及時的點(diǎn)擊反饋(這意味著更好的用戶...
摘要:二分析排查一步驟一使用搜索引擎我是在無意中發(fā)現(xiàn)該問題的,當(dāng)時觀察到的現(xiàn)象是綁定在上的事件有時會被觸發(fā),有時會失效。這說明并不存在偶爾失效的問題。也就是說,我需要找到確切的令響應(yīng)事件失效的原因。接下來的事很簡單,繼續(xù)搜索事件在頁面滾動后失效。 如果你關(guān)注我應(yīng)該知道,我最近對PC端頁面進(jìn)行移動適配。在這個過程中,為了節(jié)省用戶300ms的時間,同時給予用戶更及時的點(diǎn)擊反饋(這意味著更好的用戶...
閱讀 2380·2021-11-17 09:33
閱讀 877·2021-10-13 09:40
閱讀 606·2019-08-30 15:54
閱讀 810·2019-08-29 15:38
閱讀 2442·2019-08-28 18:15
閱讀 2505·2019-08-26 13:38
閱讀 1871·2019-08-26 13:36
閱讀 2158·2019-08-26 11:36