我正在尝试在web worker中移动navigator.geolocation的代码。
我尝试使用Chrome和Safari,但在
上获得“未定义”var isGPSSupported = navigator.geolocation;
感到沮丧......他们在规范中说网络工作者应该支持'navigator'对象......
我的代码如下:
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.");
}
}
任何有关错误的提示都将受到高度赞赏。
答案 0 :(得分:9)
我之前有类似的问题并问过a related question。现在我相信我有你的问题的答案(以及我的一个相关问题)。
navigator.geolocation仅属于主线程中的导航器,但不属于工作线程中的导航器。
主要原因是即使工作线程中的导航器看起来与主线程中的导航器完全相同,这两个导航器在C ++端也有独立的实现。这就是工作线程中不支持navigator.geolocation的原因。
相关代码位于Chromium代码中的Navigator.idl和WorkerNavigator.idl。您可以看到它们是.idl文件中的两个独立接口。并且它们在绑定的C ++端具有独立的实现。导航器是DOMWindow的属性,而WorkerNavigator是WorkerGlobalScope的属性。
但是,在JavaScript方面,它们具有相同的名称:navigator。由于两个导航器位于两个不同的范围内,因此没有名称冲突。但是当在JavaScript中使用API时,如果主线程和工作线程具有相同的名称,人们通常会期望类似的行为。这就是模糊性的发生。
答案 1 :(得分:5)
支持“导航器”对象 ,但它只包含四个属性:appName,appVersion,userAgent和platform。
通过查看您的代码,您似乎正在尝试跟踪用户的位置,因为它发生了变化。您不必使用Web worker来完成此任务。您可以使用 watchPosition()简单地监控用户在主线程上的位置,只要用户的位置发生变化,它就会自动通知回调函数:
navigator.geolocation.watchPosition(function(position) {
document.getElementById('currentLat').innerHTML = position.coords.latitude;
document.getElementById('currentLon').innerHTML = position.coords.longitude;
});
答案 2 :(得分:1)
在chrome中检查它,它似乎肯定没有geolocation属性:
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中,您可以在工作人员中设置断点。我建议你这样做是为了你的错误,非常有帮助。
答案 3 :(得分:-1)
将主线程postMessage()中的watchPosition(成功)作为webWorker的新位置是不够的?