欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談javascript的Touch事件

 更新時(shí)間:2015年09月27日 09:10:36   投稿:hebedich  
在本文深入研究iOS和Android設(shè)備提供的觸摸事件API,探索一下可以構(gòu)建哪些類型的應(yīng)用,給出一些最佳做法,并論及一些使得可觸控應(yīng)用(touch-enabled application)的開(kāi)發(fā)變得更加容易的有用技術(shù)。

js的touch事件,一般用于移動(dòng)端的觸屏滑動(dòng)

復(fù)制代碼 代碼如下:
$(function(){document.addEventListener("touchmove", _touch, false);}) function _touch(event){alert(1);}

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ā)事件,文檔中沒(méi)有明確說(shuō)明。

以上事件的event對(duì)象上面都存在如下屬性:

touches:表示當(dāng)前跟蹤的觸摸操作的Touch對(duì)象的數(shù)組。
targetTouches:特定于事件目標(biāo)的Touch對(duì)象的數(shù)組。
changeTouches:表示自上次觸摸以來(lái)發(fā)生了什么改變的Touch對(duì)象的數(shù)組。

每個(gè)Touch對(duì)象包含下列屬性:

clientX:觸摸目標(biāo)在視口中的X坐標(biāo)。
clientY:觸摸目標(biāo)在視口中的Y坐標(biāo)。
identifier:表示觸摸的唯一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)

觸摸事件

三種在規(guī)范中列出并獲得跨移動(dòng)設(shè)備廣泛實(shí)現(xiàn)的基本觸摸事件:
     1. touchstart:手指放在一個(gè)DOM元素上。
     2. touchmove:手指拖曳一個(gè)DOM元素。
     3. touchend:手指從一個(gè)DOM元素上移開(kāi)。

每個(gè)觸摸事件都包括了三個(gè)觸摸列表:
     1. touches:當(dāng)前位于屏幕上的所有手指的一個(gè)列表。
     2. targetTouches:位于當(dāng)前DOM元素上的手指的一個(gè)列表。
     3. changedTouches:涉及當(dāng)前事件的手指的一個(gè)列表

    例如,在一個(gè)touchend事件中,這就會(huì)是移開(kāi)的手指。

這些列表由包含了觸摸信息的對(duì)象組成:
     1. identifier:一個(gè)數(shù)值,唯一標(biāo)識(shí)觸摸會(huì)話(touch session)中的當(dāng)前手指。
     2. target:DOM元素,是動(dòng)作所針對(duì)的目標(biāo)。
     3. 客戶/頁(yè)面/屏幕坐標(biāo):動(dòng)作在屏幕上發(fā)生的位置。
     4. 半徑坐標(biāo)和 rotationAngle:畫(huà)出大約相當(dāng)于手指形狀的橢圓形。

可觸控應(yīng)用  

     touchstart、touchmove和touchend事件提供了一組足夠豐富的功能來(lái)支持幾乎是任何類型的基于觸摸的交互——其中包括常見(jiàn)的多點(diǎn)觸摸手勢(shì),比如說(shuō)捏縮放、旋轉(zhuǎn)等待。    下面的這段代碼讓你使用單指觸摸來(lái)四處拖曳一個(gè)DOM元素:

 var obj = document.getElementByIdx_x_x_x_x_x_x('id');
 obj.addEventListener('touchmove', function(event) 
 { // 如果這個(gè)元素的位置內(nèi)只有一個(gè)手指的話
    if (event.targetTouches.length == 1) 
 {
  var touch = event.targetTouches[0];
   // 把元素放在手指所在的位置
   obj.style.left = touch.pageX + 'px';
     obj.style.top = touch.pageY + 'px';
  }
}, false);

      下面是一個(gè)示例,該例子顯示了屏幕上當(dāng)前所有的觸點(diǎn),它的作用就是用來(lái)感受一下設(shè)備的響應(yīng)性。

   // 設(shè)置畫(huà)布并通過(guò)ctx變量來(lái)暴露上下文復(fù)制代碼
 canvas.addEventListener('touchmove',   
 function(event) {
    for (var i = 0; i < event.touches.length; i++) {
 var touch = event.touches;
  ctx.beginPath();
    ctx.arc(touch.pageX, touch.pageY, 20, 0, 2*Math.PI, true);
    ctx.fill();
    ctx.stroke();
   }
  }, false);

演示

      到處都有著許多有意思的多點(diǎn)觸摸演示,比如說(shuō)這個(gè)由Paul Irish和其他人實(shí)現(xiàn)的基于畫(huà)布的繪畫(huà)演示。

      還有Browser Ninja,一個(gè)技術(shù)演示,是一個(gè)使用了CSS3的轉(zhuǎn)換、過(guò)渡和畫(huà)布的Fruit Ninja克隆。

最佳做法

阻止縮放

     缺省的多點(diǎn)觸摸設(shè)置不是特別的好用,因?yàn)槟愕幕瑒?dòng)和手勢(shì)往往與瀏覽器的行為有關(guān)聯(lián),比如說(shuō)滾動(dòng)和縮放。

     要禁用縮放功能的話,使用下面的元標(biāo)記設(shè)置你的視圖區(qū)(viewport),這樣其對(duì)于用戶來(lái)說(shuō)就是不可伸縮的了:
     content="width=device-width, initial-scale=1.0, user-scalable=no">
     看看這篇關(guān)于移動(dòng)HTML 5的文章,了解更多關(guān)于視圖區(qū)設(shè)置的信息。

阻止?jié)L動(dòng)

     一些移動(dòng)設(shè)備有缺省的touchmove行為,比如說(shuō)經(jīng)典的iOS overscroll效果,當(dāng)滾動(dòng)超出了內(nèi)容的界限時(shí)就引發(fā)視圖反彈。這種做法在許多多點(diǎn)觸控應(yīng)用中會(huì)帶來(lái)混亂,但要禁用它很容易。

   document.body.addEventListener('touchmove', function(event) {
    event.preventDefault();
   }, false); 

細(xì)心渲染

     如果你正在編寫(xiě)的多點(diǎn)觸控應(yīng)用涉及了復(fù)雜的多指手勢(shì)的話,要小心地考慮如何響應(yīng)觸摸事件,因?yàn)橐淮我幚磉@么多的事情??紤]一下前面一節(jié)中的在屏幕上畫(huà)出所有觸點(diǎn)的例子,你可以在有觸摸輸入的時(shí)候就立刻進(jìn)行繪制:

  canvas.addEventListener('touchmove', function(event) {
   renderTouches(event.touches);
  },

    不過(guò)這一技術(shù)并不是要隨著屏幕上的手指?jìng)€(gè)數(shù)的增多而擴(kuò)充,替代做法是,可以跟蹤所有的手指,然后在一個(gè)循環(huán)中做渲染,這樣可獲得更好的性能:

  var touches = []
  canvas.addEventListener('touchmove', function(event) {
    touches = event.touches;
  }, false);
  // 設(shè)置一個(gè)每秒60幀的定時(shí)器
  timer = setInterval(function() {
   renderTouches(touches);
  }, 15);

     提示:setInterval不太適合于動(dòng)畫(huà),因?yàn)樗鼪](méi)有考慮到瀏覽器自己的渲染循環(huán)?,F(xiàn)代的桌面瀏覽器提供了requestAnimationFrame這一函數(shù),基于性能和電池工作時(shí)間原因,這是一個(gè)更好的選擇。一但瀏覽器提供了對(duì)該函數(shù)的支持,那將是首選的處理事情的方式。

使用targetTouches和changedTouches
    要記住的一點(diǎn)是,event.touches是與屏幕接觸的所有手指的一個(gè)數(shù)組,而不僅是位于目標(biāo)DOM元素上的那些。你可能會(huì)發(fā)現(xiàn)使用 event.targetTouches和event.changedTouches來(lái)代替event.touches更有用一些。

    最后一點(diǎn),因?yàn)槟闶窃跒橐苿?dòng)設(shè)備做開(kāi)發(fā),因此你應(yīng)該要留心移動(dòng)的最佳做法,這些在Eric Bidelman的文章中有論及,以及要了解這一W3C文檔。

設(shè)備支持     

    遺憾的是,觸摸事件的實(shí)現(xiàn)在完備性和質(zhì)量方面的差別很大。我編寫(xiě)了一個(gè)診斷腳本來(lái)顯示一些關(guān)于觸摸API實(shí)現(xiàn)的基本信息,其中包括哪些事件是支持的,以及 touchmove事件觸發(fā)的解決方案。我在Nexus One和Nexus S硬件上測(cè)試了Android2.3.3,在Xoom上測(cè)試了Android 3.0.1,以及在iPad和iPhone上測(cè)試了iOS 4.2。

    簡(jiǎn)而言之,所有被測(cè)試的瀏覽器都支持touchstart、touchend和touchmove事件。

    規(guī)范提供了額外的三個(gè)觸摸事件,但被測(cè)試的瀏覽器沒(méi)有支持它們:
      1. touchenter:移動(dòng)的手指進(jìn)入一個(gè)DOM元素。
      2. toucheleave:移動(dòng)手指離開(kāi)一個(gè)DOM元素。
      3. touchcancel:觸摸被中斷(實(shí)現(xiàn)規(guī)范)。

     被測(cè)試的瀏覽器還在每個(gè)觸摸列表內(nèi)部都提供了touches、targetTouches和changedTouches列表。不過(guò),被測(cè)試的瀏覽器沒(méi)有支持radiusX、radiusY或是rotationAngle屬性,這些屬性指明觸摸屏幕的手指的形狀。在一次touchmove期間,事件大約一秒鐘觸發(fā)60次,所有的被測(cè)試設(shè)備都是這樣。

相關(guān)文章

  • webpack結(jié)合express實(shí)現(xiàn)自動(dòng)刷新的方法

    webpack結(jié)合express實(shí)現(xiàn)自動(dòng)刷新的方法

    這篇文章主要給大家介紹了關(guān)于webpack結(jié)合express實(shí)現(xiàn)自動(dòng)刷新的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用webpack具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 微信小程序如何播放騰訊視頻的實(shí)現(xiàn)

    微信小程序如何播放騰訊視頻的實(shí)現(xiàn)

    這篇文章主要介紹了微信小程序如何播放騰訊視頻的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • js實(shí)現(xiàn)單擊可修改表格

    js實(shí)現(xiàn)單擊可修改表格

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)單擊可修改表格,類似成績(jī)單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • JavaScript實(shí)現(xiàn)簡(jiǎn)單計(jì)算器小程序

    JavaScript實(shí)現(xiàn)簡(jiǎn)單計(jì)算器小程序

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單計(jì)算器小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • JavaScript中發(fā)布/訂閱模式的簡(jiǎn)單實(shí)例

    JavaScript中發(fā)布/訂閱模式的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了JavaScript中發(fā)布/訂閱模式的簡(jiǎn)單實(shí)例,本文給出了一個(gè)簡(jiǎn)單易懂的實(shí)現(xiàn)代碼,比較容易理解,需要的朋友可以參考下
    2014-11-11
  • bootstrap實(shí)現(xiàn)tab選項(xiàng)卡切換

    bootstrap實(shí)現(xiàn)tab選項(xiàng)卡切換

    這篇文章主要為大家詳細(xì)介紹了bootstrap實(shí)現(xiàn)tab選項(xiàng)卡切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 深入了解JavaScript代碼覆蓋

    深入了解JavaScript代碼覆蓋

    這篇文章主要介紹了深入了解JavaScript代碼覆蓋 ,代碼覆蓋提供有關(guān)是否以及可選地應(yīng)用程序的某些部分被執(zhí)行的頻率的信息。它通常用于判定一個(gè)測(cè)試套件執(zhí)行特定代碼庫(kù)的全面程度。,需要的朋友可以參考下
    2019-06-06
  • js獲取瀏覽器和屏幕的各種寬度高度

    js獲取瀏覽器和屏幕的各種寬度高度

    本文主要介紹了js獲取瀏覽器和屏幕的各種寬度高度的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • 如何解決ligerUI布局時(shí)Center中的Tab高度大小

    如何解決ligerUI布局時(shí)Center中的Tab高度大小

    這篇文章主要介紹了如何解決ligerUI布局時(shí)Center中的Tab高度大小的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • Es6 Generator函數(shù)詳細(xì)解析

    Es6 Generator函數(shù)詳細(xì)解析

    Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語(yǔ)法行為與傳統(tǒng)函數(shù)完全不同。這篇文章給大家介紹Es6 Generator函數(shù)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2018-02-02

最新評(píng)論