為了更好地為移動設(shè)備服務(wù),HTML5推出了一系列針對移動設(shè)備的API。
1、Geolocation API
Geolocation接口用于獲取用戶的地理位置。它使用的方法基于GPS或者其他機(jī)制(比如IP地址、WIFI熱點等)。
下面的方法,可以檢查瀏覽器是否支持這個接口。
if (navigator.geolocation) { // 支持} else { //不支持}
1.1 getCurrentPosition方法
getCurrentPosition方法,用來獲取用戶的地理位置。使用它需要得到用戶的授權(quán),瀏覽器會跳出一個對話框,詢問用戶是否許可當(dāng)前頁面獲取他的地理位置。必須考慮兩種情況的回調(diào)函數(shù):一種是同意授權(quán),另一種是拒絕授權(quán)。如果用戶拒絕授權(quán)會拋出一個錯誤。
navigator.geolocation.getCurrentPosition(geoSuccess, geoError);
上面代碼指定了處理當(dāng)前地址位置的兩個回調(diào)函數(shù)。
(1)同意授權(quán)
如果用戶同意授權(quán),就會調(diào)用geoSuccess。
function geoSuccess(event) { var coords = event.coords; console.log('latitude: ' + coords.latitude); //緯度 console.log('longitude: ' + coords.longitude); //經(jīng)度 console.log('accuracy: ' + coords.accuracy); //精度 console.log('altitude: ' + coords.altitude); //海拔 console.log('altitudeAccuracy: ' + coords.altitudeAccuracy); //海拔精度(單位:米) console.log('heading: ' + coords.heading); //以360度表示的方向 console.log('speed: ' + coords.speed); //每秒的速度(單位:米)}
geoSuccess的參數(shù)是一個event對象。event.coords屬性指向一個對象,包含了用戶的位置信息,主要是以下幾個值:
-
coords.latitude:緯度
-
coords.longitude:經(jīng)度
-
coords.accuracy:精度
-
coords.altitude:海拔
-
coords.altitudeAccuracy:海拔精度(單位:米)
-
coords.heading:以360度表示的方向
-
coords.speed:每秒的速度(單位:米)
(2)拒絕授權(quán)
如果用戶拒絕授權(quán),就會調(diào)用geoError。
function geoError(event) { console.log('Error code ' + event.code + '. ' + event.message); }
geoError的參數(shù)也是一個event對象。event.code屬性表示錯誤類型,有四個值:
-
0:未知錯誤,瀏覽器沒有提示出錯的原因,相當(dāng)于常量event.UNKNOWN_ERROR。
-
1:用戶拒絕授權(quán),相當(dāng)于常量event.PERMISSION_DENIED
-
2:沒有得到位置,GPS或其他定位機(jī)制無法定位,相當(dāng)于常量event.POSITION_UNAVAILABLE。
-
3:超時,GPS沒有在指定時間內(nèi)返回結(jié)果,相當(dāng)于常量event.TIMEOUT。
event.message為錯誤提示信息。
(3)設(shè)置定位行為
getCurrentPosition方法還可以接受一個對象作為第三個參數(shù),用來設(shè)置定位行為。
var option = { enableHighAccuracy: true, timeout: Infinity, maximumAge: 0}; navigator.geolocation.getCurrentPosition(geoSuccess, geoError, option);
這個參數(shù)對象有三個成員:
-
enableHighAccuracy:如果設(shè)為true,就要求客戶端提供更精確的位置信息,這會導(dǎo)致更長的定位時間和更大的耗電,默認(rèn)設(shè)置為false。
-
timeout:等待客戶端做出回應(yīng)的最大毫秒數(shù),默認(rèn)值為Infinity(無限)。
-
maxinumAge:客戶端可以使用緩存數(shù)據(jù)的最大毫秒數(shù)。如果設(shè)為0,客戶端不讀取緩存;如果設(shè)為infinity,客戶端只讀取緩存。
1.2 watchPosition方法和clearWatch方法
watchPosition方法可以用來監(jiān)聽用戶位置的持續(xù)改變,使用方法與getCurrentPosition方法一樣。
var watchID = navigator.geolocation.watchPosition(geoSuccess, geoError);
一旦用戶位置發(fā)生改變,就會調(diào)用回調(diào)函數(shù)。
如果要取消監(jiān)聽,則使用clearWatch方法。
navigator.geolocation.clearWatch(watchID);
2、Vibration API
Vibration接口用于在瀏覽器中發(fā)出命令,使得設(shè)備振動。由于該操作很耗電,在低電量時最好取消該操作。
使用下面的代碼檢查該接口是否可用。目前,只有Chrome和Firefox的Android平臺最新版本支持它。
navigator.vibrate = navigator.vibrate || navigator.webkitVibrate || navigator.mozVibrate || navigator.msVibrate;if (navigator.vibrate) { // 支持}
vibrate方法可以使得設(shè)備振動,它的參數(shù)就是振動持續(xù)的毫秒數(shù)。
navigator.vibrate(1000);
上面的代碼使得設(shè)備振動1秒鐘。
vibrate方法還可以接受一個數(shù)組作為參數(shù),表示振動的模式。偶數(shù)位置的數(shù)組成員表示振動的毫秒數(shù),奇數(shù)位置的數(shù)組成員表示等待的毫秒數(shù)。
navigator.vibrate([500, 300, 500]);
上面代碼表示,設(shè)備先振動500毫秒,然后等待300毫秒,再接著振動500毫秒。
vibrate是一個非阻塞式的操作,即手機(jī)振動的同時,JavaScript代碼繼續(xù)向下運行。要停止振動,只有將0毫秒傳入vibrate方法。
navigator.vibrate(0);
3、亮度調(diào)節(jié)
當(dāng)移動設(shè)備的亮度傳感器,感知外部亮度發(fā)生顯著變化時,會觸發(fā)devicelight事件。目前,只有Firefox布署了這個API。
window.addEventListener('devicelight', function(event) { console.log(event.value + 'lux'); })
下面代碼表示,devicelight事件的回調(diào)函數(shù),接受一個事件對象作為參數(shù)。該對象的value屬性就是亮度值。
這種API的一種應(yīng)用是,我們可以針對亮度的強弱來改網(wǎng)頁背景和文字顏色。