å°çä½ç½®å®ä½ (Geolocation)
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´7æ.
Web Apps è¥éè¦ä½¿ç¨è çä½ç½®ï¼å¯éé Geolocation API åå¾ç¸éè³è¨ãèåºæ¼é±ç§æ¬çèéï¼éäº Web Apps åå¿ é åå¾ä½¿ç¨è ç許å¯ä¹å¾ï¼æè½ç¼ä½ä½ç½®è³è¨ã
å°çä½ç½®å®ä½ (Geolocation) ç©ä»¶
Geolocation APIï¼æ¯éé navigator.geolocation ç©ä»¶æç¼ä½ã
è¥è©²ç©ä»¶å¯ç¨ï¼å³å¯é²è¡å°çä½ç½®å®ä½æåãå æ¤å¯å 測試å°çä½ç½®å®ä½æ¯å¦åå¨ï¼
if ("geolocation" in navigator) {
/* geolocation is available */
} else {
/* geolocation IS NOT available */
}
å註ï¼å¨ Firefox 24 ä¹å¾ççæ¬ï¼å³ä½¿åç¨æ¤ APIï¼navigator ä¸çãgeolocationãä¹å樣åå³ trueãæ¤åé¡å·²æ ¹æè¦æ ¼èæ¼` Firefox 25 ä¸ä¿®æ£ (bug 884921)ã
åå¾ç®åä½ç½®
è¥è¦åå¾ä½¿ç¨è
ç®åçä½ç½®ï¼å¯å¼å« getCurrentPosition() å½å¼ã妿¤å°ååé忥åçè«æ±ï¼ä»¥åµæ¸¬ä½¿ç¨è
çä½ç½®ï¼ä¸¦å°æ¥è©¢å®ä½ç¡¬é«èå徿æ°è³è¨ã䏿¦æ±ºå®ä½ç½®ï¼é¨å³å·è¡ç¹å®çåå¼å¸¸å¼ (Callback routine)ãè¥ç¼çé¯èª¤ï¼åå¯é¸ææ¯å¦æä¾ç¬¬äºæ¬¡åå¼ã第ä¸é
忏çºé¸é
ä»é¢ (亦å¯é¸ææ¯å¦ä½¿ç¨ä¹)ï¼å¯è¨å®ä½ç½®åå³ççæé·æéï¼èè«æ±ççå¾
æéã
è¥ä¸è«å®ä½ç²¾ç¢ºåº¦èæ³åå¿«åºå®å®ä¸ä½ç½®ï¼åå¯ä½¿ç¨ getCurrentPosition()ã以å
·å GPS çè£ç½®çºä¾ï¼å¾å¾éèæ 1 åéææ´é·çæéèåºå® GPS è³è¨ãä¹å æ¤ï¼getCurrentPosition() å¯è½åå¾è¼ä½ç²¾ç¢ºåº¦çè³æ (IP ä½ç½®æ WiFi) èé¨å³éå§ä½æ¥ã
å註ï¼ä¾é è¨å¼ï¼getCurrentPosition() å°åå¿«åå³è¼ä½ç²¾ç¢ºåº¦ççµæãè¥ä¸è«ç²¾ç¢ºåº¦èåªè¦åå¿«ç²å¾çæ¡ï¼åå¯ä½¿ç¨ getCurrentPosition()ãèä¾ä¾èªªï¼æè¼ GPS çè£ç½®å¯è½éè¦ä¸æ®µæéæè½åå¾ GPS å®ä½è³è¨ï¼æä»¥å¯è½å°ä½ç²¾ç¢ºåº¦çè³æ (IP ä½ç½®æ Wifi) åå³è³ getCurrentPosition()ã
navigator.geolocation.getCurrentPosition(function (position) {
do_something(position.coords.latitude, position.coords.longitude);
});
䏿¦åå¾å®ä½ä½ç½®ä¹å¾ï¼ä¸åç¯ä¾é¨å³å°å·è¡ do_something() å½å¼ã
è§çç®åä½ç½®
妿å®ä½è³ææ¹è® (å¯è½æ¯è£ç½®ç§»åï¼æå徿´ç²¾ç¢ºçå°çä½ç½®è³è¨)ï¼åå¯è¨å® 1 çµåå¼å½å¼ï¼ä½¿å
¶é¨èæ´æ°éçå®ä½è³è¨èå¼å«ä¹ãèéååä½å¯éé watchPosition() å½å¼å®æãwatchPosition() æå
·åç輸å
¥åæ¸è getCurrentPosition()ç¸åãåå¼å½å¼å°å¼å«æ¸æ¬¡ï¼è®ç覽å¨å¯æ¼ä½¿ç¨è
ç§»åæéæ´æ°ä½ç½®ï¼æå¯æ ¹æç®åæä½¿ç¨çä¸åå®ä½æè¡ï¼æä¾æ´ç²¾ç¢ºçå®ä½è³è¨ãè¥ä¸ç´æªå峿æçµæï¼åé¯èª¤åå¼ (Error Callback) å½å¼å
å°å¼å« 1 次ãå¦è«æ³¨æï¼é¯èª¤åå¼å½å¼å
éæ¼ getCurrentPosition()ï¼å æ¤çºé¸å¡«ã
å註ï¼ä¸éåå getCurrentPosition() å¼å«ï¼äº¦å¯ä½¿ç¨ watchPosition()ã
var watchID = navigator.geolocation.watchPosition(function (position) {
do_something(position.coords.latitude, position.coords.longitude);
});
watchPosition() å½å¼å°åå³ 1 çµ ID ç·¨èï¼å°ç¨ä»¥èå¥å¿
è¦çå®ä½ç£çå¡ (Watcher)ãèæ¤æ¸å¼è¥æé
clearWatch() å½å¼ï¼å³å¯åæ¢è§ç使ç¨è
çä½ç½®ã
navigator.geolocation.clearWatch(watchID);
微調åæ
getCurrentPosition() è watchPosition() åå¯å®¹ç´ 1 çµæååå¼ã1 çµé¯èª¤åå¼ (é¸å¡«)ã1 çµ PositionOptions ç©ä»¶ (é¸å¡«)ã
å° watchPosition çå¼å«æé¡ä¼¼å¦ä¸ï¼
function geo_success(position) {
do_something(position.coords.latitude, position.coords.longitude);
}
function geo_error() {
alert("Sorry, no position available.");
}
var geo_options = {
enableHighAccuracy: true,
maximumAge: 30000,
timeout: 27000,
};
var wpid = navigator.geolocation.watchPosition(
geo_success,
geo_error,
geo_options,
);
ç¾æç watchPosition Demoï¼http://www.thedotproduct.org/experiments/geo/
æè¿°ä½ç½®
以 Position ç©ä»¶åç
§ Coordinates ç©ä»¶ï¼å³å¯æè¿°ä½¿ç¨è
çä½ç½®ã
èçé¯èª¤
å¨å¼å« getCurrentPosition() æ watchPosition() æï¼è¥ç²å¾é¯èª¤åå¼å½å¼ï¼åé¯èª¤åå¼å½å¼ç第ä¸çµåæ¸å°çº PositionError ç©ä»¶ï¼
function errorCallback(error) {
alert("ERROR(" + error.code + "): " + error.message);
}
å°çä½ç½®å®ä½å¯¦éç¯ä¾
>HTML å §å®¹
<p><button onclick="geoFindMe()">Show my location</button></p>
<div id="out"></div>
JavaScript å §å®¹
function geoFindMe() {
var output = document.getElementById("out");
if (!navigator.geolocation) {
output.innerHTML = "<p>Geolocation is not supported by your browser</p>";
return;
}
function success(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
output.innerHTML =
"<p>Latitude is " +
latitude +
"° <br>Longitude is " +
longitude +
"°</p>";
var img = new Image();
img.src =
"http://maps.googleapis.com/maps/api/staticmap?center=" +
latitude +
"," +
longitude +
"&zoom=13&size=300x300&sensor=false";
output.appendChild(img);
}
function error() {
output.innerHTML = "Unable to retrieve your location";
}
output.innerHTML = "<p>Locatingâ¦</p>";
navigator.geolocation.getCurrentPosition(success, error);
}
ç¾å ´æ¸¬è©¦çµæ
è¥ç¡æ³é¡¯ç¤ºï¼å¯è³æ¬æå³ä¸è§ãLanguageãåæåè±æåæè§çã
è«æ±æ¬é
addons.mozilla.org 䏿æä¾çä»»ä½éå å
ä»¶ï¼åªè¦ä½¿ç¨å°çä½ç½®å®ä½è³æï¼åå¿
é æç¢ºåå¾è¨±å¯æè½ç¹¼çºä½æ¥ãä¸åå½å¼è©¢å許å¯çæ¹æ³ï¼åé¡ä¼¼ç¶²é è©¢å許å¯çèªåæç¤ºæ¹æ³ï¼ä½æ´çºç°¡å®ãè¥çºå¯å¥ç¨ççæ
ï¼å使ç¨è
çåæå°å²åæ¼ pref 忏ææå®çå好ä¸ãæ¼ callback 忏䏿æä¾çå½å¼ï¼å°éé 1 çµä»£è¡¨ä½¿ç¨è
åæç叿å¼èå¼å«ä¹ãè¥ä½¿ç¨è
çåæçº trueï¼åéå å
ä»¶ææååå°çä½ç½®å®ä½è³æã
function prompt(window, pref, message, callback) {
let branch = Components.classes[
"@mozilla.org/preferences-service;1"
].getService(Components.interfaces.nsIPrefBranch);
if (branch.getPrefType(pref) === branch.PREF_STRING) {
switch (branch.getCharPref(pref)) {
case "always":
return callback(true);
case "never":
return callback(false);
}
}
let done = false;
function remember(value, result) {
return function () {
done = true;
branch.setCharPref(pref, value);
callback(result);
};
}
let self = window.PopupNotifications.show(
window.gBrowser.selectedBrowser,
"geolocation",
message,
"geo-notification-icon",
{
label: "Share Location",
accessKey: "S",
callback: function (notification) {
done = true;
callback(true);
},
},
[
{
label: "Always Share",
accessKey: "A",
callback: remember("always", true),
},
{
label: "Never Share",
accessKey: "N",
callback: remember("never", false),
},
],
{
eventCallback: function (event) {
if (event === "dismissed") {
if (!done) callback(false);
done = true;
window.PopupNotifications.remove(self);
}
},
persistWhileVisible: true,
},
);
}
prompt(
window,
"extensions.foo-addon.allowGeolocation",
"Foo Add-on wants to know your location.",
function callback(allowed) {
alert(allowed);
},
);
è¦ç¯
| Specification |
|---|
| Geolocation > # geolocation_interface > |
ç覽å¨ç¸å®¹æ§
Gecko 註è¨
Firefox å¯éé Google çå®ä½æå (Google Location Servicesï¼GLS)ï¼æ ¹æä½¿ç¨è ç WiFi è³è¨èæ¾åºä½¿ç¨è çä½ç½®ãè Google ä¹éæäº¤æçè³æï¼å å« WiFi ååé» (Access Point) è³æãAccess token (é¡ä¼¼ 2 å禮æç cookie)ã使ç¨è ç IP ä½åãè¥éæ´å¤è³è¨ï¼å¯åé± Mozilla çé±ç§æ¬æ¿çè Google çé±ç§æ¬æ¿çãå ¶å §å°è©³è¿°è³æçä½¿ç¨æ¹å¼ã
Firefox 3.6 (Gecko 1.9.2) æ°æ¯æ´äº GPSD (GPS daemon) æåï¼é©å Linux çå°çä½ç½®å®ä½ã