JS觸摸事件、手勢(shì)事件詳解
觸屏已經(jīng)是我們身邊電子設(shè)備的常態(tài)了。觸摸事件當(dāng)然也是隨著觸屏的出現(xiàn),用戶使用最多的事件啦!
難道使用觸屏事件后,其他原來(lái)的鼠標(biāo)事件就都不能用啦?當(dāng)然不是,只不過(guò)不是那么好用啊。
針對(duì)鼠標(biāo)事件,有哪些不適應(yīng)?
dbclick
觸屏設(shè)備不支持雙擊事件。雙擊瀏覽器窗口,會(huì)放大畫面。
可以通過(guò)在head標(biāo)簽內(nèi)加上這么一行:
<meta name="viewport" content="width=device-width, minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
可以實(shí)現(xiàn),我們編寫的頁(yè)面不會(huì)隨著用的手勢(shì)而放大縮小。
關(guān)于meta標(biāo)簽,我還沒(méi)有研究過(guò),罪過(guò)啊。
mouse
在觸屏上,我們單擊一個(gè)元素,會(huì)相應(yīng)的觸發(fā):mousemove mousedown mouseup click,所以當(dāng)我們編寫移動(dòng)客戶端界面時(shí),可以為元素直接添加move事件,可以提高效率。
同時(shí)也會(huì)觸發(fā)mouseover與mouseout,測(cè)試結(jié)果,我發(fā)現(xiàn),只有當(dāng)頁(yè)面第一次刷新時(shí),單擊元素,參會(huì)觸發(fā)mouseover事件。
隨著觸屏移動(dòng)端設(shè)備的普及使用,W3C開(kāi)始制定TouchEvent規(guī)范。
觸摸事件
該類事件會(huì)在用戶手指放在屏幕上面時(shí),在屏幕上滑動(dòng)時(shí),或從屏幕上移開(kāi)時(shí)觸發(fā)。具體來(lái)說(shuō)有以下幾個(gè)觸摸事件。
1、touchstart
當(dāng)手指放在屏幕上觸發(fā)。
2、touchmove
當(dāng)手指在屏幕上滑動(dòng)時(shí),連續(xù)地觸發(fā)。
3、touchend
當(dāng)手指從屏幕上離開(kāi)時(shí)觸發(fā)。
4、touchcancel
當(dāng)系統(tǒng)停止跟蹤時(shí)觸發(fā),系統(tǒng)什么時(shí)候取消,文檔沒(méi)有明確的說(shuō)明。
【總】以上四個(gè),是w3c提供的觸摸事件,只針對(duì)觸摸設(shè)備,最常用的是前三個(gè)。
由于觸摸會(huì)導(dǎo)致屏幕動(dòng)來(lái)動(dòng)去,所以可以會(huì)在這些事件的事件處理函數(shù)內(nèi)使用event.preventDefault(),來(lái)阻止屏幕的默認(rèn)滾動(dòng)。
除了常用的DOM屬性,觸摸事件還包含下列三個(gè)用于跟蹤觸摸的屬性。
1、touches:表示當(dāng)前跟蹤的觸摸操作的touch對(duì)象的數(shù)組。
當(dāng)一個(gè)手指在觸屏上時(shí),event.touches.length=1,
當(dāng)兩個(gè)手指在觸屏上時(shí),event.touches.length=2,以此類推。
2、targetTouches:特定于事件目標(biāo)的touch對(duì)象數(shù)組。
因?yàn)閠ouch事件是會(huì)冒泡的,所以利用這個(gè)屬性指出目標(biāo)對(duì)象。
3、changedTouches:表示自上次觸摸以來(lái)發(fā)生了什么改變的touch對(duì)象的數(shù)組。
每個(gè)touch對(duì)象都包含下列幾個(gè)屬性:
4、clientX:觸摸目標(biāo)在視口中的x坐標(biāo)。
clientY:觸摸目標(biāo)在視口中的y坐標(biāo)。
identifier:標(biāo)識(shí)觸摸的唯一ID。
pageX:觸摸目標(biāo)在頁(yè)面中的x坐標(biāo)。
pageY:觸摸目標(biāo)在頁(yè)面中的y坐標(biāo)。
screenX:觸摸目標(biāo)在屏幕中的x坐標(biāo)。
screenY:觸摸目標(biāo)在屏幕中的y坐標(biāo)。
target:觸摸的DOM節(jié)點(diǎn)目標(biāo)。
【如何使用呢?】
EventUtil.addHandler(div,"touchstart",function(event){
div.innerHTML=event.touches[0].clientX+','+event.touches[0].clientY;
});
EventUtil.addHandler(div,"touchmove",function(event){
event.preventDefault();
div.innerHTML=event.touches[0].clientX;
});
EventUtil.addHandler(div,"touchend",function(event){
div.innerHTML=event.changedTouches[0].clientY;
});
使用clientX……時(shí),必須要指明具體的touch對(duì)象,而不要直接指明數(shù)組。
event.touches[0]
在touchend事件處理函數(shù)中,當(dāng)該事件發(fā)生時(shí),touches里面已經(jīng)沒(méi)有任何的touch對(duì)象了,此時(shí),就要使用changeTouches集合。
手勢(shì)事件
- gesturestart:當(dāng)一個(gè)手指已經(jīng)按在屏幕上,而另一個(gè)手指又觸摸在屏幕時(shí)觸發(fā)。
- gesturechange:當(dāng)觸摸屏幕的任何一個(gè)手指的位置發(fā)生變化時(shí)觸發(fā)。
- gestureend:當(dāng)任何一個(gè)手指從屏幕上面移開(kāi)時(shí)觸發(fā)。
【注意】只有兩個(gè)手指都觸摸到事件的接收容器時(shí)才觸發(fā)這些手勢(shì)事件。
觸摸事件與手勢(shì)事件之間的關(guān)系
1、當(dāng)一個(gè)手指放在屏幕上時(shí),會(huì)觸發(fā)touchstart事件,如果另一個(gè)手指又放在了屏幕上,則會(huì)觸發(fā)gesturestart事件,隨后觸發(fā)基于該手指的touchstart事件。
2、如果一個(gè)或兩個(gè)手指在屏幕上滑動(dòng),將會(huì)觸發(fā)gesturechange事件,但只要有一個(gè)手指移開(kāi),則會(huì)觸發(fā)gestureend事件,緊接著又會(huì)觸發(fā)toucheend事件。
手勢(shì)的專有屬性
- rotation:表示手指變化引起的旋轉(zhuǎn)角度,負(fù)值表示逆時(shí)針,正值表示順時(shí)針,從零開(kāi)始。
- scale:表示兩個(gè)手指之間的距離情況,向內(nèi)收縮會(huì)縮短距離,這個(gè)值從1開(kāi)始,并隨距離拉大而增長(zhǎng)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用JS監(jiān)聽(tīng)鍵盤按下事件(keydown event)
- jQuery/JS監(jiān)聽(tīng)input輸入框值變化實(shí)例
- Nodejs監(jiān)聽(tīng)日志文件的變化的過(guò)程解析
- 教你3分鐘利用原生js實(shí)現(xiàn)有進(jìn)度監(jiān)聽(tīng)的文件上傳預(yù)覽組件
- vuejs中監(jiān)聽(tīng)窗口關(guān)閉和窗口刷新事件的方法
- 基于Angular.js實(shí)現(xiàn)的觸摸滑動(dòng)動(dòng)畫實(shí)例代碼
- JS觸摸屏網(wǎng)頁(yè)版仿app彈窗型滾動(dòng)列表選擇器/日期選擇器
- 移動(dòng)端js觸摸事件詳解
- javascript移動(dòng)開(kāi)發(fā)中touch觸摸事件詳解
- JavaScript監(jiān)聽(tīng)觸摸事件代碼實(shí)例
相關(guān)文章
基于JavaScript實(shí)現(xiàn)的快速排序算法分析
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)的快速排序算法,分析了快速排序的原理并結(jié)合實(shí)例形式給出了javascript快速排序的操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04
js中用事實(shí)證明cssText性能高的問(wèn)題
首先要感謝 EtherDream 的不同觀點(diǎn),在 巧用cssText屬性批量操作樣式 一篇中由于他的質(zhì)疑態(tài)度使我做了進(jìn)一步的測(cè)試。2011-03-03
詳解JavaScript實(shí)現(xiàn)監(jiān)聽(tīng)路由變化
前端實(shí)現(xiàn)路由變化主要有兩種方式,本文主要介紹了這兩種方法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
JavaScript計(jì)算字符串中特定字符出現(xiàn)次數(shù)的實(shí)例詳解
在JavaScript編程中,經(jīng)常會(huì)遇到需要計(jì)算字符串中特定字符出現(xiàn)次數(shù)的情況,在本文中,我將分享兩個(gè)簡(jiǎn)單的JavaScript函數(shù),用于計(jì)算字符串中特定字符出現(xiàn)的次數(shù),需要的朋友可以參考下2023-11-11
JavaScript處理中文字符串的Base64編碼與解碼的兩種方法
這篇文章主要介紹了在 JavaScript 中處理中文字符串的 Base64 編碼與解碼,解釋了 Base64 編碼與中文字符沖突的原因,分別闡述了手動(dòng)實(shí)現(xiàn)和使用TextEncoder和TextDecoder API 兩種方法,包括編碼和解碼的具體實(shí)現(xiàn)及示例,最后總結(jié)了兩種方法的適用場(chǎng)景2025-01-01
JavaScript 冒泡排序和選擇排序的實(shí)現(xiàn)代碼
本文通過(guò)實(shí)例代碼給大家介紹了js冒泡排序和選擇排序的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-09-09

