亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

移動web開發之touch事件實例詳解

2024-05-06 16:42:00
字體:
來源:轉載
供稿:網友

前面的話

iOS版Safari為了向開發人員傳達一些特殊信息,新增了一些專有事件。因為iOS設備既沒有鼠標也沒有鍵盤,所以在為移動Safari開發交互性網頁時,常規的鼠標和鍵盤事件根本不夠用。隨著Android 中的WebKit的加入,很多這樣的專有事件變成了事實標準,導致W3C開始制定Touch Events規范。本文將詳細介紹移動端touch事件

概述

包含iOS 2.0軟件的iPhone 3G發布時,也包含了一個新版本的Safari瀏覽器。這款新的移動Safari提供了一些與觸摸(touch)操作相關的新事件。后來,Android上的瀏覽器也實現了相同的事件。觸摸事件會在用戶手指放在屏幕上面時、在屏幕上滑動時或從屏幕上移開時觸發。具體來說,有以下幾個觸摸事件

touchstart:當手指觸摸屏幕時觸發;即使已經有一個手指放在了屏幕上也會觸發touchmove:當手指在屏幕上滑動時連續地觸發。在這個事件發生期間,調用preventDefault()可以阻止滾動touchend:當手指從屏幕上移開時觸發touchcancel:當系統停止跟蹤觸摸時觸發(不常用)。關于此事件的確切觸發時間,文檔中沒有明確說明

【touchenter 和 touchleave】

觸摸事件規范中曾經包含touchenter和touchleave事件,這兩個事件在用戶手指移入或移出某個元素時觸發。但是這兩個事件從來沒有被實現。微軟有這兩個事件的替代事件,但是只有IE瀏覽器支持。某些情況下可以知道用戶手指滑入滑出某個元素是素是非常有用的,所以希望這兩個事件可以重返規范

在觸摸事件中,常用的是touchstart、touchumove和touchend這三個事件,與鼠標事件的對應如下

鼠標   觸摸   mousedown touchstart mousemove touchmove mouseup  touchend

[注意]touch事件在chrome模擬器下部分版本使用DOM0級事件處理程序的方式來添加事件無效

<!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問題是指在某個元素執行它的功能和執行touch事件之間有一個300毫秒的間隔。鼠標事件、焦點事件、瀏覽器默認行為等相較于touch事件,都存在著300ms的延遲

【點透】

因為300ms的存在,會造成常見的點透問題。先來看例子

<!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>

淺藍色的半透明div被點擊(觸發touch事件)后,如果點擊位置正好位于鏈接的上方,則會觸發鏈接跳轉的默認行為。詳細解釋是,點擊頁面后,瀏覽器會記錄所點擊的頁面坐標,300ms后,在該坐標找到元素。在該元素上觸發點擊行為。因此,如果300ms內同一頁面坐標的上層元素消失后,300ms后在下層元素上觸發點擊行為。這就造成了點透問題

造成這個問題,是因為觸摸屏幕的行為被重載(overload)了。在手指觸摸屏幕的瞬間,瀏覽器無法預知用戶是在輕觸(Tap)、雙觸(Double-Tap)、滑動(Swipe)、按住不放(Hold)還是其他什么操作。唯一保險的做法就是等上一會兒看接下來會發生什么

問題是在于雙觸(Double-Tap)。即便是瀏覽器檢測出手指離開了屏幕,它仍然無法判斷接下來做什么。因為瀏覽器無法知道手指是會再次回到屏幕,還是就此結束觸發輕觸事件以及事件級聯。為了確定這一點,瀏覽器不得不等待一小段時間。瀏覽器開發者找到一個最佳時間間隔,就是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、使用緩動動畫,增加300ms的過渡效果,注意display屬性無法使用transition

3、加入中間層的dom元素,讓中間層接受這個穿透事件,稍后隱藏

4、上下兩級都使用tap事件,但默認行為不可避免

5、在document上的touchstart事件,阻止默認行為。

document.addEventListener('touchstart',function(e){  e.preventDefault();})

接著,添加a標簽的跳轉行為

a.addEventListener('touchstart',function(){ window.location.href = 'https://cnblogs.com'; })

但是,這種方法有副作用,會造成頁面無法滾動、文本無法選中等。如果在某個元素上,需要恢復文本選中的行為,則可以使用阻止冒泡來恢復

el.addEventListener('touchstart',function(e){  e.stopPropagation();})

事件對象

【基礎信息】

每個觸摸事件的event對象都提供了在鼠標事件中常見的屬性,包括事件類型、事件目標對象、事件冒泡、事件流、默認行為等

以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屬性返回事件正在執行的監聽函數所綁定的節點

2、target屬性返回事件的實際目標節點

3、srcElement屬性與target屬性功能一致

//當前目標currentTarget:[object HTMLDivElement]//實際目標target:[object HTMLDivElement]//實際目標srcElement:[object HTMLDivElement]

4、eventPhase屬性返回一個整數值,表示事件目前所處的事件流階段。0表示事件沒有發生,1表示捕獲階段,2表示目標階段,3表示冒泡階段

5、bubbles屬性返回一個布爾值,表示當前事件是否會冒泡。該屬性為只讀屬性

6、cancelable屬性返回一個布爾值,表示事件是否可以取消。該屬性為只讀屬性

//事件流eventPhase: 2//可冒泡bubbles: true//默認事件可取消cancelable: true

【touchList】

除了常見的DOM屬性外,觸摸事件對象有一個touchList數組屬性,其中包含了每個觸摸點的信息。如果用戶使用四個手指觸摸屏幕,這個數組就會有四個元素。一共有三個這樣的數組

1、touches:當前觸摸屏幕的觸摸點數組(至少有一個觸摸在事件目標元素上)

2、changedTouches :導致觸摸事件被觸發的觸摸點數組

3、targetTouches:事件目標元素上的觸摸點數組

如果用戶最后一個手指離開屏幕觸發touchend事件,這最后一個觸摸點信息不會出現在targetTouches和touches數組中,但是會出現在changedTouched數組中。因為是它的離開觸發了touchend事件,所以changedTouches數組中仍然包含它。上面三個數組中,最常用的是changedTouches數組

(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); });  })();

【事件坐標】

上面這些觸摸點數組中的元素可以像普通數組那樣用數字索引。數組中的元素包含了觸摸點的有用信息,尤其是坐標信息。每個Touch對象包含下列屬性

clientx:觸摸目標在視口中的x坐標clientY:觸摸目標在視口中的y坐標identifier:標識觸摸的唯一IDpageX:觸摸目標在頁面中的x坐標(包含滾動)pageY:觸摸目標在頁面中的y坐標(包含滾動)screenX:觸摸目標在屏幕中的x坐標screenY:觸摸目標在屏幕中的y坐標target:觸摸的DOM節點目標

changedTouches數組中的第一個元素就是導致事件觸發的那個觸摸點對象(通常這個觸摸點數組不包含其他對象)。這個觸摸點對象含有clientX/Y和pageX/Y坐標信息。除此之外還有screenX/Y和x/y,這些坐標在瀏覽器間不太一致,不建議使用

clientX/Y和pageX/Y的區別在于前者相對于視覺視口的左上角,后者相對于布局視口的左上角。布局視口是可以滾動的

(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); });  })();

以上這篇移動web開發之touch事件實例詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产日韩一区二区| 国产成人拍精品视频午夜网站| 中文精品99久久国产香蕉| 欧美性生交大片免费| 亚洲国产欧美一区二区三区同亚洲| 91精品免费视频| 欧美电影在线观看完整版| 亚洲精品www| 国产精品久久色| 91精品国产高清久久久久久久久| 国产成人一区三区| 一本色道久久综合亚洲精品小说| 隔壁老王国产在线精品| 国产亚洲精品美女久久久| 91高清视频免费| 555www成人网| 欧美在线亚洲在线| 欧美精品电影免费在线观看| 国产91网红主播在线观看| 欧美另类高清videos| 国产精品美女网站| 欧美日韩成人黄色| 国产精品视频1区| 精品国产一区二区三区久久久狼| 亚洲欧美国产精品va在线观看| 97视频在线免费观看| www.久久色.com| 国产精品综合久久久| 成人精品在线视频| 国产精品综合不卡av| 久久久www成人免费精品| 色系列之999| 亚洲国语精品自产拍在线观看| 日韩一区二区久久久| 久久在线免费观看视频| 国产亚洲欧美日韩美女| 精品亚洲夜色av98在线观看| 91亚洲精华国产精华| 亚洲аv电影天堂网| 欧美日韩国产成人在线| 久久国产精品首页| 欧美最近摘花xxxx摘花| 日本午夜在线亚洲.国产| 国产精品女主播| 亚洲美女在线观看| 福利二区91精品bt7086| 亚洲精品wwww| 国产精品视频自拍| 日韩成人激情视频| 久久伊人91精品综合网站| 亚洲视频在线观看免费| 91豆花精品一区| 亚洲精品二三区| 久久露脸国产精品| 精品福利樱桃av导航| 国产精品专区第二| 国内精品久久久久| 国产精品福利网| 日韩欧美在线观看| 久久精品成人欧美大片古装| 这里只有精品在线播放| 国产亚洲精品综合一区91| 亚洲娇小xxxx欧美娇小| 亚洲国产精品999| 亚洲区中文字幕| 欧美性猛交xxxxx水多| 欧美极品少妇全裸体| 日韩欧美在线免费| 亚洲视频在线视频| 97精品免费视频| 欧美日在线观看| 国产精品免费视频xxxx| 欧美另类69精品久久久久9999| 日韩av在线电影网| 成人激情视频在线观看| 欧美激情精品久久久久久| 91免费福利视频| 欧美日韩一区二区免费在线观看| 美日韩精品视频免费看| 成人黄色av播放免费| 日韩在线观看你懂的| 国产欧美一区二区三区视频| 国内精品久久久久伊人av| 国产成人在线视频| 91精品国产91久久久久久吃药| 精品毛片网大全| 亚洲成在人线av| 国产成人在线一区二区| 国产精品久久久久久久久久久不卡| www.日韩不卡电影av| 国产精品美女av| www.日韩av.com| 国产伦精品一区二区三区精品视频| 成人av.网址在线网站| 亚洲国产私拍精品国模在线观看| 亚洲欧美日韩精品久久亚洲区| 欧亚精品在线观看| 国语自产在线不卡| 亚洲国产成人精品久久久国产成人一区| 欧美日韩性生活视频| 欧美日韩亚洲视频| 97免费中文视频在线观看| 国产精品一区二区性色av| 成人午夜在线影院| 中文字幕欧美视频在线| 欧美黄色小视频| 亚洲综合中文字幕在线| 亚洲欧美在线免费观看| 国产精品入口日韩视频大尺度| 国产精品久久久av| 亚洲男人的天堂网站| 欧洲美女免费图片一区| 亚洲乱亚洲乱妇无码| 91精品国产高清自在线| 色婷婷综合久久久久中文字幕1| 欧美国产日韩精品| 亚洲已满18点击进入在线看片| 亚洲毛片一区二区| 国产成人精品视频在线观看| 国产精品永久在线| 精品视频久久久久久久| 日韩亚洲一区二区| 欧美疯狂xxxx大交乱88av| 久久久久久久一区二区| 国产精品丝袜一区二区三区| 国产精品女主播视频| 国产亚洲精品久久久久久777| 久久伊人91精品综合网站| 亚洲午夜av久久乱码| 欧美乱妇高清无乱码| 成人中心免费视频| 日韩福利伦理影院免费| 亚洲最大福利视频网站| 成人免费在线视频网址| 日韩av成人在线观看| 欧美成人合集magnet| 夜夜躁日日躁狠狠久久88av| 欧美日韩中国免费专区在线看| 中文字幕日韩精品在线观看| 亚洲欧美日韩精品久久奇米色影视| 国产精品福利小视频| 欧美在线免费观看| 色天天综合狠狠色| 国产午夜精品全部视频播放| 亚洲亚裔videos黑人hd| 亚洲欧美日本伦理| 日韩中文字幕不卡视频| 日韩欧美亚洲范冰冰与中字| 亚洲高清福利视频| 国产午夜精品全部视频在线播放| 欧美亚洲激情在线| 国产精品美女999| 日韩av在线免费观看一区| 国产在线精品自拍| 久久久精品视频成人| 在线观看欧美日韩国产| 日本在线精品视频| 国产成人极品视频| 亚洲欧洲免费视频| 久久久免费观看| 国产精品一区二区久久久久| 国产成人精品久久二区二区| 亚洲精品国产欧美| 91精品在线看|