新聞中心
本篇文章是一個由四個部分構成的系列的第三部分,該文章系列旨在尋找并突出說明HTML5中的變化。其開始先介紹新的標簽和頁面的組織,接著提供一些網(wǎng)頁設計方面的高層面信息,然后是表單的創(chuàng)建,以及API的使用及其價值所在,最后是Canvas提供的一些頗具創(chuàng)意的可能做法。這一第三部分介紹了HTML5的API,使用一個例子頁面來說明它們的功能。

那么,什么是API呢?
應用編程接口(application program interface,API)是訪問一個軟件應用的編程指令和標準的集合。通過使用API,你就可以設計出由API提供的服務來驅動的產(chǎn)品。
HTML5擁有一些新的API,例如:
1. 一個與新的畫布元素一起使用的2D繪圖API,用于渲染圖形或是其他的視覺圖像
2. 一個支持離線web應用的緩存機制的API
3. 一個播放視頻和音頻的API,與新的視頻和音頻元素一起使用
4. 一個歷史記錄API,其把瀏覽歷史變成可訪問的,并允許把頁面添加到這一歷史中
5. 一個和draggable屬性一起使用的拖放API
6. 一個和contenteditable屬性一起使用的編輯API
7. 鍵-值對以及內嵌的SQL數(shù)據(jù)庫的客戶端存儲,使用了JavaScript API
本篇文章重點關注兩個API:Geolocation和Web Worker,首先對這些API本身進行分析,然后創(chuàng)建一個包含這兩個API的頁面。
無處不在的業(yè)務:Geolocation
Geolocation API被用來確定和分享地理位置,API返回經(jīng)度和緯度坐標——這是企業(yè)可用來在這一坐標附近的區(qū)域提供服務的信息,這類服務通常被稱作基于位置的服務(location-based service, LBS)。
LBS以地理數(shù)據(jù)源為參考,這些地理數(shù)據(jù)源被用來標識被監(jiān)控儀器的物理位置,從而識別出與這一位置相關的人。這一功能賦予感興趣的各方與這一個人進行交互的機會,這種交互是基于一些以地理位置為中心的興趣點市場來進行的。
商業(yè)實際上是為客戶創(chuàng)造品質、實用性和價值,并同時為利益相關者、債權人、股東、員工和供應商創(chuàng)造經(jīng)濟和金融利益。以地理位置為驅動力的LBS使得跟蹤和監(jiān)控一個包裹或是使用了非瀏覽器設備或是瀏覽器的個人變得相當容易起來。從商業(yè)化的角度來說,地理位置所涉及的就是使用地理資產(chǎn)來確定某人或是某物所處的位置,然后把這一特定的一組信息出售給想要把這些信息用于社會、商業(yè)或是其他目的的的任何人,只要信息的擁有者的這種做法是法律許可的就可以了。
地理定位(geolocation)的工作方式
Geolocation API基于navigator這一全局對象的一個新屬性:navigator.geolocation,這一JavaScript的navigator對象提供了一些關于訪問者的瀏覽器和系統(tǒng)的有用信息。Geolocation可以確定使用了IP地址、基于web的數(shù)據(jù)庫、無線網(wǎng)絡連接,以及三角定位或是GPS技術的訪問者的經(jīng)度和緯度。應該要注意的一點是,由Geolocation提供的信息的準確性會基于獲取信息的手段而發(fā)生變化。偶然情況下,在一些位置上,你有可能不能獲得明確的地理位置讀數(shù)或是一點數(shù)據(jù)都接收不到。
腳本可使用navigator.geolocation對象來確定與用戶的宿主設備相關的位置信息,在檢索到位置信息之后,一個位置對象就會被創(chuàng)建出來,并使用這些數(shù)據(jù)做填充。
navigator.geolocation對象有三個方法:
1. getCurrentPosition()
2. watchPosition()
3. clearWatch()
getCurrentPosition()方法
getCurrentPosition()方法檢索用戶的當前位置,但只檢索一次。當該方法被腳本調用時,方法以異步的方式來嘗試獲取宿主設備的當前位置。異步通信意味著發(fā)送者和接收者并未同時地加入到這一通信過程中,使用異步通信能讓瀏覽器繼續(xù)進行其他方面的活動,這樣它就無需等待來自接收實體的響應。
getCurrentPosition()方法最多可以有三個參數(shù):
1. geolocationSuccess:帶回當前位置的回調(callback)(必需的)
2. geolocationError. 有錯誤發(fā)生時使用的回調(可選的)
3. geolocationOptions. 地理位置選項(可選的)
navigator.geolocation.getCurrentPositon()方法使用一個Position對象作為參數(shù)來把宿主設備的當前位置返回給geolocationSuccess這一回調,如果有錯誤發(fā)生的話,geolocationError回調會使用一個PositionError對象來做調用。你可以設置geolocationOptions的三個屬性:
enableHighAccuracy、timeout和maximumAge,這些可選屬性相應的作用分別是啟用了高的精確性,如果設備支持這種高精確性的話;一個超時時段,這是位置應該被返回的最長等待時間;以及一個最大的時間數(shù),緩存的位置在這一時間段內可被使用。
getCurrentPosition()方法的調用如下所示:
- void navigator.geolocation.getCurrentPosition(
- geolocationSuccess, geolocationError, geolocationOptions);
watchPosition()方法
watchPosition()方法定期輪詢用戶的位置,查看用戶的位置是否發(fā)生改變。其最多可帶三個參數(shù)。
當watchPosition被調用時,其異步地啟動一個查看過程,這一過程涉及了一個新的Position對象的獲取和一個watchID的創(chuàng)建。如果這一獲取操作是成功的,則相關的使用一個Position對象作為參數(shù)的geolocationSuccess就會被調用。在失敗時涉及的操作則是使用一個非空的geolocationError參數(shù)來調用該方法,watchPosition方法使用一個PositionError對象作為參數(shù)來生成geolocationError。當設備的位置發(fā)生改變時,一個合適的帶有新的Position對象的回調就會被調用。
watchPosition()方法的調用如下所示:
- long navigator.geolocation.watchPosition(
- geolocationSuccess, geolocationError, geolocationOptions);
clearWatch()方法
clearWatch()方法終止正在進行的watchPosition(),該方法只能帶一個參數(shù)。在調用時,其找到之前已經(jīng)開始了的watchID參數(shù)并立即停止它。
clearWatch()方法的調用如下所示:
- void navigator.geolocation.clearWatch(watchID)
Geolocation數(shù)據(jù):Position對象
Geolocation API返回一個地理上的Position對象,該對象有兩個屬性:timestamp和coords。timestamp屬性表示地理位置數(shù)據(jù)的創(chuàng)建時間,coords屬性又包含七個屬性:
1. coords.latitude:估計緯度
2. coords.longitude:估計經(jīng)度
3. coords.altitude:估計高度
4. coords.accuracy:所提供的以米為單位的經(jīng)度和緯度估計的精確度
5. coords.altitudeAccuracy:所提供的以米為單位的高度估計的精確度
6. coords.heading: 宿主設備當前移動的角度方向,相對于正北方向順時針計算
7. coords.speed:以米每秒為單位的設備的當前對地速度
這些屬性中只有三項是保證有的:coords.latitude、coords.longitude和coords.accuracy,其余的返回null,這取決于設備的能力和其所采用的后端定位服務器。如果可能的話,heading和speed屬性可以基于用戶之前的位置計算出來。
發(fā)揮救援作用的web worker
web worker(web工作線程)補救了并發(fā)所引起的問題,web worker是HTML5家族對JavaScript的單線程問題的回答:它們在與主頁面分開的線程中運行處理過程,保留頁面以用于主要的功能,比如說維持一個穩(wěn)定的UI等。
一個web worker是一個在后臺加載并執(zhí)行的JavaScript文件,這些worker允許你動態(tài)地加載一個JavaScript,然后使用后臺的不會影響到UI的進程來執(zhí)行腳本。web worker的訪問是受限的,其只允許傳遞字符串。因為web worker不使用瀏覽器的UI線程,所以他們不允許訪問DOM。worker可以使用這兩個worker全局范圍的self和this引用,worker和父頁面的通信是通過使用事件模型和postMessage()方法來實現(xiàn)的。
因為web worker有多線程行為,因此它們只能訪問JavaScript功能的一個子集,web worker可以:
1. 訪問navigator對象
2. 使用只讀的位置對象
3. 執(zhí)行XMLHttpRequest以發(fā)送HTTP或是HTTPS請求
4. 使用setTimeout()/clearTimeout()和setInterval()/clearInterval()來設置時間或是時間間隔
5. 訪問應用的緩存
6. 使用 importScripts()方法來導入外部的腳本
7. 產(chǎn)生其他的web worker(子worker(subworker)必需有著與主頁面一樣的來源,且必須放置于與父worker同樣的地點。
web worker有兩種類型:專用型的worker和共享型的worker。
專用型web worker
專用型worker與創(chuàng)建它的腳本鏈接在一起,它可以與其他的worker或是瀏覽器組件通信,但是他不能與DOM通信。
專用型worker的創(chuàng)建方法是把一個JavaScript文件名傳遞給一個新的worker實例,通過指定worker的執(zhí)行腳本URI來使用Worker()構造函數(shù)創(chuàng)建一個新的worker。要創(chuàng)建一個專用型worker的話,輸入下面給出的代碼,這一代碼創(chuàng)建了一個新的專用的Worker對象:
- var worker = new Worker('worker.js');
共享型web worker
共享型web worker和專用型worker一樣,不能訪問DOM,并且是受限地訪問窗體的屬性。共享型web worker只能與其他來自同一個域的共享型web worker通信,它的創(chuàng)建方法是把一個JavaScript名稱傳遞給一個新的共享型worker的實例來創(chuàng)建。
頁面腳本可以與共享型web worker通信,而然,與專用型web worker不同的是,通信是通過使用一個端口(port)對象并附加上一個消息事件處理程序來進行的。另外,在使用第一個postMessage()之前,你必須要調用端口的start()方法。
在收到web worker腳本的首個消息之后,共享型web worker把一個事件處理程序附加到激活的端口上。一般情況下,處理程序會運行自己的postMessage()方法來把一個消息返回給調用代碼,接著端口的start()方法生成一個有效的消息進程。
為了創(chuàng)建一個共享型web worker,你必須要創(chuàng)建一個SharedWorker對象而不是一個Worker對象。下面的代碼說明了如何創(chuàng)建一個新的SharedWorker對象:
- var worker = new SharedWorker('worker.js');
構造一個包含了這兩個API的頁面
你將設計一個包含了Geolocation和Web Worker API的基本工作模式的頁面,此外,你還會用到Google Map API來渲染作為地圖收集來的數(shù)據(jù)。
頁面的組織如圖1所示,其包含了一個使用< header>< /header>標簽來創(chuàng)建的Header區(qū),一個使用< section>< /section>標簽來創(chuàng)建的Section區(qū),以及一個使用< aside>< /aside>標簽來創(chuàng)建的Aside區(qū)。
圖1. API頁面的布局
< section>和< aside>區(qū)包含了API,Section區(qū)包含了Geolocation API,Aside區(qū)包含了web worker,其用來計算素數(shù)。
在執(zhí)行時,網(wǎng)頁的顯示如圖2所示。如果要查看地理位置數(shù)據(jù)的話,你首先必須要同意共享你的信息。web worker在頁面加載時啟動,如果你想看一看找到的素數(shù)的話,點擊Display Web Worker按鈕。
圖2. API網(wǎng)頁
#p#
HTML文件
HTML文件一開始的內容是清單1所示的標準的HTML5信息,< head>部分包含了一個到Google Maps API的調用,把sensor的值設置為False。使用Google Maps API對你狀態(tài)的要求是,你的應用是否在使用一個傳感器,比如說GPS來確立位置。你必須為你的Google Maps API應用聲明一個值為True或是False的sensor參數(shù),sensor的值必須被聲明。< head>標簽還包含了到JavaScript和CSS3文件的鏈接,這些文件被用來處理網(wǎng)頁的功能和格式。
清單1. HTML文件開始部分的內容
Basic GeoLocation Map & Web Worker Prime Number Calculator


咨詢
建站咨詢