我想将我的代码navigator.geolocation在一个网络工作者。
我用Chrome和Safari尝试过,但在得到“未定义”
被isGPSSupported = navigator.geolocation;
失意......他们在规范说“导航”的对象应该在网络工作者的支持...
我的代码如下:
index.js
var gpsWorker = new Worker("app/gpsworker.js");
gpsWorker.onmessage = function (e) {
alert(e.data);
};
gpsWorker.postMessage("Start GPS!");
gpsWorker.onerror = function (e) {
alert("Error in file: " + e.filename + "\nline: " + e.lineno + "\nDescription: " + e.message);
};
gpsworker.js
self.onmessage = function (e) {
initGeoLoc();
}
function initGeoLoc() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
self.postMessage("Got position!");
});
} else {
self.postMessage("GPS is not supported on this platform.");
}
}
什么是错的任何暗示将不胜感激。
我以前也有类似的问题,因为你,问一个相关的问题 。 现在,我相信我有这个回答你的问题(和我相关的问题也一个)。
navigator.geolocation属于只在主线程导航仪,但不属于在工作线程导航器。
主要的原因是,即使在工作线程导航看起来完全一样的一个主线程,这两个导航对C ++侧独立实现。 这就是为什么navigator.geolocation没有在工作线程的支持。
相关的代码是在Navigator.idl和WorkerNavigator.idl在Chromium代码。 你可以看到,他们在的.idl文件中的两个独立的接口。 他们对结合的C ++侧独立实现。 导航仪的属性DOMWindow ,而WorkerNavigator是一个属性WorkerGlobalScope 。
然而,在JavaScript端,它们具有相同的名称:导航仪。 由于这两个导航是在两个不同的领域,没有名称冲突。 但是,使用JavaScript中的API时,人们通常想到的主,辅助线程类似的行为,如果他们有相同的名称。 这就是不确定性是如何发生的。
在“导航”的对象是支持的,但它仅包含四个属性:应用程序的名字,appVersion,的userAgent,和平台。
从看你的代码,它似乎您试图跟踪用户的位置,因为它的变化。 您不必使用网络工作者做到这一点。 你可以简单地使用watchPosition()主线程,它会自动通知回调函数,每当用户的位置变动对监控用户的位置:
navigator.geolocation.watchPosition(function(position) {
document.getElementById('currentLat').innerHTML = position.coords.latitude;
document.getElementById('currentLon').innerHTML = position.coords.longitude;
});
在Chrome检查它,它看起来绝对不具有地理位置属性:
WorkerNavigator
appName: "Netscape"
appVersion: "5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
onLine: true
platform: "Win32"
userAgent: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
__proto__: WorkerNavigator
在Chrome中,你可以设置你的工人一个断点。 我建议这样做,你的错误,它极有帮助。
难道不足以在主线程的postMessage的watchPosition(成功)()的新位置,以您的webWorker?