最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

移動(dòng)web開發(fā)之touch事件實(shí)例詳解

 更新時(shí)間:2018年01月17日 08:39:40   作者:小火柴的藍(lán)色理想  
下面小編就為大家分享一篇移動(dòng)web開發(fā)之touch事件實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

前面的話

iOS版Safari為了向開發(fā)人員傳達(dá)一些特殊信息,新增了一些專有事件。因?yàn)閕OS設(shè)備既沒有鼠標(biāo)也沒有鍵盤,所以在為移動(dòng)Safari開發(fā)交互性網(wǎng)頁時(shí),常規(guī)的鼠標(biāo)和鍵盤事件根本不夠用。隨著Android 中的WebKit的加入,很多這樣的專有事件變成了事實(shí)標(biāo)準(zhǔn),導(dǎo)致W3C開始制定Touch Events規(guī)范。本文將詳細(xì)介紹移動(dòng)端touch事件

概述

包含iOS 2.0軟件的iPhone 3G發(fā)布時(shí),也包含了一個(gè)新版本的Safari瀏覽器。這款新的移動(dòng)Safari提供了一些與觸摸(touch)操作相關(guān)的新事件。后來,Android上的瀏覽器也實(shí)現(xiàn)了相同的事件。觸摸事件會(huì)在用戶手指放在屏幕上面時(shí)、在屏幕上滑動(dòng)時(shí)或從屏幕上移開時(shí)觸發(fā)。具體來說,有以下幾個(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)手指從屏幕上移開時(shí)觸發(fā)
touchcancel:當(dāng)系統(tǒng)停止跟蹤觸摸時(shí)觸發(fā)(不常用)。關(guān)于此事件的確切觸發(fā)時(shí)間,文檔中沒有明確說明

【touchenter 和 touchleave】

觸摸事件規(guī)范中曾經(jīng)包含touchenter和touchleave事件,這兩個(gè)事件在用戶手指移入或移出某個(gè)元素時(shí)觸發(fā)。但是這兩個(gè)事件從來沒有被實(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í)事件處理程序的方式來添加事件無效

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

【點(diǎn)透】

因?yàn)?00ms的存在,會(huì)造成常見的點(diǎn)透問題。先來看例子

<!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 >百度</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)擊頁面后,瀏覽器會(huì)記錄所點(diǎn)擊的頁面坐標(biāo),300ms后,在該坐標(biāo)找到元素。在該元素上觸發(fā)點(diǎn)擊行為。因此,如果300ms內(nèi)同一頁面坐標(biāo)的上層元素消失后,300ms后在下層元素上觸發(fā)點(diǎn)擊行為。這就造成了點(diǎn)透問題

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

問題是在于雙觸(Double-Tap)。即便是瀏覽器檢測(cè)出手指離開了屏幕,它仍然無法判斷接下來做什么。因?yàn)闉g覽器無法知道手指是會(huì)再次回到屏幕,還是就此結(jié)束觸發(fā)輕觸事件以及事件級(jí)聯(lián)。為了確定這一點(diǎn),瀏覽器不得不等待一小段時(shí)間。瀏覽器開發(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的過渡效果,注意display屬性無法使用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.; 
})

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

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

事件對(duì)象

【基礎(chǔ)信息】

每個(gè)觸摸事件的event對(duì)象都提供了在鼠標(biāo)事件中常見的屬性,包括事件類型、事件目標(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)聽函數(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表示事件沒有發(fā)生,1表示捕獲階段,2表示目標(biāo)階段,3表示冒泡階段

5、bubbles屬性返回一個(gè)布爾值,表示當(dāng)前事件是否會(huì)冒泡。該屬性為只讀屬性

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

//事件流
eventPhase: 2
//可冒泡
bubbles: true
//默認(rèn)事件可取消
cancelable: true

【touchList】

除了常見的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è)手指離開屏幕觸發(fā)touchend事件,這最后一個(gè)觸摸點(diǎn)信息不會(huì)出現(xiàn)在targetTouches和touches數(shù)組中,但是會(huì)出現(xiàn)在changedTouched數(shù)組中。因?yàn)槭撬碾x開觸發(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)在頁面中的x坐標(biāo)(包含滾動(dòng))
pageY:觸摸目標(biāo)在頁面中的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ì)于視覺視口的左上角,后者相對(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開發(fā)之touch事件實(shí)例詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • javascript原型模式用法實(shí)例詳解

    javascript原型模式用法實(shí)例詳解

    這篇文章主要介紹了javascript原型模式用法,以實(shí)例形式較為詳細(xì)的分析了javascript原型模式的原理與使用技巧,需要的朋友可以參考下
    2015-06-06
  • js中Array.sort()利用零值多維排序

    js中Array.sort()利用零值多維排序

    本文主要介紹了js中Array.sort()利用零值多維排序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • JS中動(dòng)態(tài)創(chuàng)建元素的三種方法總結(jié)(推薦)

    JS中動(dòng)態(tài)創(chuàng)建元素的三種方法總結(jié)(推薦)

    下面小編就為大家?guī)硪黄狫S中動(dòng)態(tài)創(chuàng)建元素的三種方法總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • 詳解JavaScript中數(shù)組的一些特殊用法

    詳解JavaScript中數(shù)組的一些特殊用法

    數(shù)組是幾乎所有編程語言的基礎(chǔ)語法,本文將不會(huì)介紹數(shù)組的基礎(chǔ)語法和用法,而是從JavaScript中數(shù)組的一些特殊之處入手,通過這些少有特性的詳細(xì)介紹,加深我們對(duì)數(shù)組的理解
    2023-02-02
  • JS中的Date()使用小結(jié)

    JS中的Date()使用小結(jié)

    Date() 日期對(duì)象是一個(gè)構(gòu)造函數(shù)必須使用new來調(diào)用創(chuàng)建我們的日期對(duì)象,本文給大家介紹JS中的Date()使用小結(jié),感興趣的朋友一起看看吧
    2024-01-01
  • js監(jiān)聽鼠標(biāo)點(diǎn)擊和鍵盤點(diǎn)擊事件并自動(dòng)跳轉(zhuǎn)頁面

    js監(jiān)聽鼠標(biāo)點(diǎn)擊和鍵盤點(diǎn)擊事件并自動(dòng)跳轉(zhuǎn)頁面

    這篇文章主要介紹了js監(jiān)聽鼠標(biāo)點(diǎn)擊(onmousedown)和鍵盤點(diǎn)擊(onkeydown)事件并自動(dòng)跳轉(zhuǎn)頁面,很簡單的一個(gè)實(shí)現(xiàn)
    2014-09-09
  • Javascript函數(shù)緩存的實(shí)現(xiàn)及應(yīng)用場(chǎng)景

    Javascript函數(shù)緩存的實(shí)現(xiàn)及應(yīng)用場(chǎng)景

    Javascript函數(shù)緩存是一種提高網(wǎng)頁性能的重要技術(shù),通過將函數(shù)結(jié)果存儲(chǔ)在緩存中,避免重復(fù)計(jì)算,從而提高頁面加載速度和響應(yīng)速度,本文主要介紹了Javascript函數(shù)緩存的實(shí)現(xiàn)及應(yīng)用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 微信小程序框架的頁面布局代碼

    微信小程序框架的頁面布局代碼

    這篇文章主要介紹了微信小程序框架的頁面布局代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 小程序開發(fā)調(diào)用微信支付以及微信回調(diào)地址配置

    小程序開發(fā)調(diào)用微信支付以及微信回調(diào)地址配置

    本文主要介紹了小程序開發(fā)調(diào)用微信支付以及微信回調(diào)地址配置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • JS原生數(shù)據(jù)雙向綁定實(shí)現(xiàn)代碼

    JS原生數(shù)據(jù)雙向綁定實(shí)現(xiàn)代碼

    本文通過實(shí)例代碼給大家介紹了JS原生數(shù)據(jù)雙向綁定問題,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-08-08

最新評(píng)論

龙里县| 通州市| 英山县| 乐陵市| 绥江县| 河间市| 涪陵区| 册亨县| 盐山县| 蛟河市| 内黄县| 青川县| 那曲县| 威信县| 南川市| 常宁市| 洞口县| 南昌县| 新邵县| 长宁区| 宁安市| 二手房| 天水市| 永靖县| 萨嘎县| 读书| 平远县| 丁青县| 滨州市| 周宁县| 泊头市| 广昌县| 绥滨县| 鹤庆县| 郑州市| 红原县| 赣州市| 临沧市| 平阳县| 沾益县| 长子县|