移動WEB開發之JS內置touch事件[轉]

?iOS上的Safari也支持click 和mouseover等傳統的交互事件,只是不推薦在iOS的瀏覽器應用上使用click和mouseover,因為這兩個事件是為了支持鼠標點擊而設計 出來的。Click事件在iOS上會有半秒左右的延遲,原因是iOS要highlight接收到click的element。而 mouseover/out等事件則會被手指的點擊觸發。所以,在iOS上,應當拋棄傳統的交互事件模型而接受一個新的事件模型。Touch事件和更高級 的Gesture事件,能讓你的網頁交互起來像native應用一樣。

????處理Touch事件能讓你跟蹤用戶的每一根手指的位置。你可以綁定以下四種Touch事件:

touchstart:??手指放到屏幕上的時候觸發

touchmove:??手指在屏幕上移動的時候觸發

touchend:??手指從屏幕上拿起的時候觸發

touchcancel:??系統取消touch事件的時候觸發。至于系統什么時候會取消,不詳。。

????Gesture事件則是對touch事件的更高級的封裝,主要處理手指slide、rotate、scale等動作,將在下一篇文章詳述。

????在開始描述touch事件之前,需要先描述一下多觸式系統中特有的touch對象(android和iOS乃至nokia最新的meego系統都模擬了類 似的對象,這里只針對iOS,因為我只有iPad可用于測試。。)。這個對象封裝一次屏幕觸摸,一般來自于手指。它在touch事件觸發的時候產生,可以 通過touch event handler的event對象取到(一般是通過event.changedTouches屬性)。這個對象包括一些重要的屬性:

client / clientY:觸摸點相對于瀏覽器窗口viewport的位置

pageX / pageY:觸摸點相對于頁面的位置

screenX /screenY:觸摸點相對于屏幕的位置

identifier: touch對象的unique ID

????我們從一個單根手指觸摸的實例開始進入多觸式網頁的世界。當一根手指放下的時候,屏幕上出現一個方塊,手指移動方塊也隨著移動,手指提起方塊消失。首先,讓我們定義一下方塊的css:

Javascript代碼?
  1. .spirit?{??????????????/?*?方塊的class名稱*/??
  2. ??
  3. ?????????position:?absolute;??
  4. ??
  5. ?????????width:?50px;??
  6. ??
  7. ?????????height:?50px;??
  8. ??
  9. ?????????background-color:?red;??
  10. ??
  11. }??



????然后,在body下定義一個接收事件的容器,這里body的height必須是100%才能占滿整個viewport:

Html代碼?
  1. <body?style=”height:?100%;margin:0;padding:0”>??
  2. ??
  3. <div?id=”canvas”??style=”position:?relative;width:100%;height:?100%;”></div>??
  4. ??
  5. </body>??



????定義touchstart的事件處理函數,并綁定事件:

Javascript代碼?
  1. //?define?global?variable??
  2. ??
  3. var?canvas?=?document.getElementByIdx_x_x_x(“canvas”),??
  4. ??
  5. ???????spirit,?startX,?startY;??
  6. ??
  7. //?touch?start?listener??
  8. ??
  9. function?touchStart(event)?{??
  10. ??
  11. ?????????event.preventDefault();??
  12. ??
  13. ?????????if?(spirit?||!?event.touches.length)?return;??
  14. ??
  15. ?????????var?touch?=?event.touches[0];??
  16. ??
  17. ?????????startX?=?touch.pageX;??
  18. ??
  19. ?????????startY?=?touch.pageY;??
  20. ??
  21. ?????????spirit?=?document_createElement_x_x_x(“div”);??
  22. ??
  23. ?????????spirit.className?=?“spirit”;??
  24. ??
  25. ?????????spirit.style.left?=?startX;??
  26. ??
  27. ?????????spirit.style.top?=?startY;??
  28. ??
  29. ?????????canvas.a(spirit);??
  30. ??
  31. }??
  32. ??
  33. //?add?touch?start?listener??
  34. ??
  35. canvas.addEventListener(“touchstart”,?touchStart,?false);??



????首先,我們將方塊spirit作為一個全局對象,因為我們現在要測試單根手指所以屏幕上最好只有一個物體在移動(等會有多觸實例)。在 touchStart這個事件處理函數中,我們也首先判斷了是否已經產生了spirit,也就是是否已經有一個手指放到屏幕上,如果是,直接返回。

????和傳統的event listener一樣,多觸式系統也會產生一個event對象,只不過這個對象要多出一些屬性,比如這里的event.touches,這個數組對象獲得 屏幕上所有的touch。注意這里的event.preventDefault(),在傳統的事件處理函數中,這個方法阻止事件的默認動作,觸摸事件的默 認動作是滾屏,我們不想屏幕動來動去的,所以先調用一下這個函數。我們取第一個touch,將其pageX/Y作為spirit創建時的初始位置。接下 來,我們創建一個div,并且設置className,left,top三個屬性。最后,我們把spirit對象a到容器中。這樣, 當第一根手指放下的時候,一個紅色的,50px見方的方塊就放到屏幕上了。

????然后,我們要開始處理手指在屏幕上移動的事件:

Javascript代碼?
  1. function?touchMove(event)?{??
  2. ??
  3. ?????????event.preventDefault();??
  4. ??
  5. ?????????if?(!spirit?||?!event.touches.length)?return;??
  6. ??
  7. ?????????var?touch?=?event.touches[0],??
  8. ??
  9. ??????????????x?=?touch.pageX?–?startX,??
  10. ??
  11. ???????????????y?=?touch.pageY?–?startY;??
  12. ??
  13. ?????????spirit.style.webkitTransform?=?'translate('?+?x?+?'px,?'?+?y?+?'px)';???????
  14. ??
  15. }??
  16. ??
  17. Canvas.addEventListener(“touchmove”,?touchMove,?false);??



????在touch move listener中,我們使用webkit特有的css屬性:webkitTransform來移動方塊,這個屬性具體怎么用請google之。建議構造 面向iOS設備的網頁的時候盡量使用webkit自己的特性,不但炫,更可以直接利用硬件來提高性能。

????最后,我們處理touchend事件。手指提起的時候方塊從屏幕上移除。

Javascript代碼?
  1. function?touchEnd(event)?{??
  2. ??
  3. ?????????If?(!spirit)?return;??
  4. ??
  5. ?????????canvas.removeChild(spirit);??
  6. ??
  7. ?????????spirit?=?null;??
  8. ??
  9. }??
  10. ??
  11. canvas.addEventListener(“touchend”,?touchEnd,?false);??



在你的ipad或者iphone上測試一下以上代碼。如果不出意外的話,一個完整的多觸式web程序就誕生了。。

這種事件處理模式雖然能夠滿足我們開發多觸式網頁應用的需求,但是start – move – end的流程有點繁瑣,能不能封裝一些常用的動作讓我們用一個event handler就能解決問題呢。沒錯,Gesture事件就是為了這個目的設計出來的,它封裝了手指的scale, slide, rotate等常用的動作。不過,下一章我們再來討論這個問題。。

附件是一個更加復雜一些的例子,每根手指放下的時候都會產生一個不同顏色的方塊,手指動的時候方塊跟著動,手指提起的時候方塊消失,請下載查看試用。


通過附件所包含的實例,我們可以看出一些較為隱蔽的特性。首先,這里我們沒有再使用event.touches取所有touch的對象,而是使用 event.changedTouches這個數組,用來取得所有跟本次事件相關的touch。但是,這里我發現一個奇怪的特性,不知道是我的ipad有 問題還是本來就是這樣,就是在有多根手指放在屏幕上的時候,如果提起一根手指,touchend事件的changedTouches中會包含所有手指的 touch對象,然后,其他幾根留在屏幕上的手指會重新觸發touchstart,并刷新所有的touch對象(identifier都不一樣了)。如果 這是一個所有設備都有的特性,那么將給編程者帶來一些不便,不知道水果為啥要這么處理。

對touch event的介紹我們點到為止,這里給大家推薦兩篇文檔:

Safari dom additions reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariJSRef/Intro/Intro.html#//apple_ref/doc/uid/TP40001482-CH2g-BAJDAJAG

Safari web content guide:

http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safariwebcontent/Introduction/Introduction.html?

轉載于:https://www.cnblogs.com/hfgb/p/7115837.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392214.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392214.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392214.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編寫代碼的軟件用什么編寫的_如何通過像編寫代碼一樣克服對編寫的恐懼

編寫代碼的軟件用什么編寫的by Chris Rowe通過克里斯羅 How often do you get the fear? What do I mean by fear? How about the knot I got in my stomach just before I plunged out of plane on a parachute jump? It’s more than the brain logically planning to av…

快速學習一個新的模塊

1、模塊名.__doc__查看函數簡介&#xff0c;為了便于查看&#xff0c;采用print&#xff08;模塊名.__doc__&#xff09;打印出來&#xff0c;這樣的格式便于查看。 2、采用內置方法dir()查看模塊的變量、函數、類等等&#xff1b;采用"模塊名.__all__"查看模塊中提供…

php 公鑰格式轉換,如何把OpenSSH公鑰轉換成OpenSSL格式

《如何把OpenSSH公鑰轉換成OpenSSL格式》要點&#xff1a;本文介紹了如何把OpenSSH公鑰轉換成OpenSSL格式&#xff0c;希望對您有用。如果有疑問&#xff0c;可以聯系我們。首先看看OpenSSL工具的簡單使用方法,我們以rsa加密算法為例生成一個私鑰&#xff1a;openssl genrsa -o…

模擬操作系統(Java)

gitee完整代碼下載 github完整代碼下載 一、 需求分析 模擬一個采用多道程序設計方法的單用戶操作系統&#xff0c;該操作系統包括進程管理、存儲管理、設備管理、文件管理和用戶接口四部分。預計程序所能達到的功能&#xff1a; 進程管理模擬&#xff1a;實現操作系統進程管…

數據庫面試復習_數據科學面試復習

數據庫面試復習大面試前先刷新 (REFRESH BEFORE THE BIG INTERVIEW) 介紹 (Introduction) I crafted this study guide from multiple sources to make it as comprehensive as possible. This guide helped me prepare for both the technical and behavioral aspects of the …

hibernate緩存

&#xff08;轉自&#xff1a;http://www.cnblogs.com/java-class/p/6108175.html&#xff09; 閱讀目錄 1. 為什么要用 Hibernate 緩存&#xff1f;2. 項目實戰3. Hibernate 緩存原理回到頂部1. 為什么要用 Hibernate 緩存&#xff1f; Hibernate是一個持久層框架&#xff0c;…

oracle 連接greenplum,Oracle通過DBLINK訪問GreenPlum

為多個數據庫之間的整合和遷移做POC&#xff0c;嘗試使用Oracle Gateway和Heterogeneous Service來中轉訪問&#xff0c;測試過好多次&#xff0c;最終發現只有在32位的Oracle當中才能成功配置。 配置環境如下&#xff1a; Windows 2003 32bit 或 Windows 2008 64bit Oracle10G…

如何使用React和Redux前端創建Rails項目

by Mark Hopson馬克霍普森(Mark Hopson) 如何使用React和Redux前端(加上Typescript&#xff01;)創建Rails項目 (How to create a Rails project with a React and Redux front-end (plus Typescript!)) 在Rails項目中使用React和Redux設置單頁Javascript App的完整指南。 (A …

分布與并行計算—用任務管理器畫CPU正弦曲線(Java)

class drawSin implements Runnable{Overridepublic void run() {final double SPLIT 0.01;// 角度的分割final int COUNT (int) (2 / SPLIT);// 2PI分割的次數&#xff0c;也就是2/0.01個&#xff0c;正好是一周final double PI Math.PI;final int interval 100;// 時間間…

Rails文件上傳file_field報錯Encoding::UndefinedConversionError

服務器用的是ubuntu12 64bit&#xff0c;環境是ruby1.9.3rails3mysql&#xff0c;測試是在windows2003上。 上傳一個【.gitconfig】文件&#xff0c;沒有問題&#xff0c;上傳【新浪微博數據挖掘.pdf】報錯&#xff0c;上傳【back.jpg】報錯。 下面是兩段信息&#xff0c;是從【…

好久不來這里寫東西了.

我正準備離開學校去實現自己的目標,很清楚自己在學校的... ...做共享程序員,就不得不考慮些商業上的東西,自己要吃飯啊!我想我是該好好的處理一下這二者的關系. 轉載于:https://www.cnblogs.com/wangxiang/archive/2007/01/01/609714.html

Asp.net mvc中使用配置Unity

第一步&#xff1a;添加unity.mvc 第二步&#xff1a;在添加之后會在app_start中生成UnityConfig.cs&#xff0c;UnityMvcActivator.cs 第三步&#xff1a;使用 第四步&#xff1a;效果展示 轉載于:https://www.cnblogs.com/WJ--NET/p/7117839.html

頂級數據恢復_頂級R數據科學圖書館

頂級數據恢復Data science is the discipline of making data useful數據科學是使數據有用的學科 When we talk about the top programming language for Data Science, we often find Python to be the best fit for the topic. Sure, Python is undoubtedly an excellent cho…

xp系統oracle數據庫,Oracle10g 數據庫的安裝基于windowsXP

Oracle的安裝一、首先去官網下載自身系統相對應的數據庫軟件http://www.oracle.com/cn/index.htmlOracle軟件本身是免費的&#xff0c;個人用途完全沒關系&#xff0c;商業用途并被發現才會被Oracle所要求收費&#xff0c;收費買的不是軟件&#xff0c;而是授權。何謂授權&…

了解React Native中的不同JavaScript環境

by Khoa Pham通過Khoa Pham 了解React Native中的不同JavaScript環境 (Get to know different JavaScript environments in React Native) React Native can be very easy to get started with, and then at some point problems occur and we need to dive deep into it.Reac…

分布與并行計算—生命游戲(Java)

生命游戲其實是一個零玩家游戲&#xff0c;它包括一個二維矩形世界&#xff0c;這個世界中的每個方格居住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決于相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多&#xff0c;這個細胞會因為資源匱…

正確認識 Vista 激活期限

當我們在安裝 Vista 時&#xff0c;可以不輸入序列號進行安裝&#xff0c;這和以往的操作系統安裝有所不同&#xff0c;我們不必再為安裝系統時找不到我們的序列號標簽而發愁。如果不輸入序列號而繼續安裝系統&#xff0c;那么系統將提示我們有30天的激活期限&#xff01;這里的…

Oracle使用hs odbc連接mssql2008

1.創建odbc 2.在 product\11.2.0\dbhome_1\hs\admin\ 下拷貝initdg4odbc,把名字改為initcrmsql&#xff08;init所建odbc的名稱&#xff09; HS_FDS_CONNECT_INFO crmsql #odbc名稱 HS_FDS_TRACE_LEVEL 0 HS_FDS_RECOVERY_ACCOUNTsa #要連接的數據庫名稱 HS_FDS_RECOVERY_PWD…

oracle修改物化視圖字段,獲取物化視圖字段的修改矢量(一)

當表建立了物化視圖日志之后&#xff0c;表的DML修改會被記錄到物化視圖日志中&#xff0c;而物化視圖日志則包含了一個修改矢量&#xff0c;來記錄哪個列被修改。在文章列的修改矢量可以通過2的N次方來獲得&#xff0c;也就是POWER(2, N)。而N的值&#xff0c;就是列的位置。但…

聚合 數據處理_R中聚合的簡介:強大的數據處理工具

聚合 數據處理by Satyam Singh Chauhan薩蒂揚辛格喬漢(Satyam Singh Chauhan) R中聚合的簡介&#xff1a;強大的數據處理工具 (An introduction to aggregates in R: a powerful tool for playing with data) Data Visualization is not just about colors and graphs. It’s …