Web Workers中的HTML5 navigator.geolocation

Olg*_*nko 7 html5 gps geolocation web-worker

我试图在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);
};
Run Code Online (Sandbox Code Playgroud)

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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

任何有关错误的提示都将不胜感激.

use*_*786 9

我和你之前有类似的问题,并问了一个相关的问题.现在我相信我有你的问题的答案(以及我的一个相关问题).

navigator.geolocation仅属于主线程中的导航器,但不属于工作线程中的导航器.

主要原因是即使工作线程中的导航器看起来与主线程中的导航器完全相同,这两个导航器在C++端也有独立的实现.这就是工作线程中不支持navigator.geolocation的原因.

相关代码位于Chromium代码中的Navigator.idlWorkerNavigator.idl中.您可以看到它们是.idl文件中的两个独立接口.并且它们在绑定的C++端具有独立的实现.导航仪的属性DOMWindow,而WorkerNavigator是一个属性WorkerGlobalScope.

但是,在JavaScript方面,它们具有相同的名称:navigator.由于两个导航器位于两个不同的范围内,因此没有名称冲突.但是当在JavaScript中使用API​​时,如果主线程和工作线程具有相同的名称,人们通常会期望类似的行为.这就是歧义发生的方式.


Joh*_*Ngo 5

在"导航"的对象支持的,但它仅包含四个属性:应用程序的名字,appVersion,的userAgent,和平台.

从查看代码看,您似乎正在尝试跟踪用户的位置,因为它发生了变化.您不必使用Web worker来完成此任务.您可以使用watchPosition()在主线程上监控用户的位置,只要用户的位置发生变化,它就会自动通知回调函数:

navigator.geolocation.watchPosition(function(position) {
    document.getElementById('currentLat').innerHTML = position.coords.latitude;
    document.getElementById('currentLon').innerHTML = position.coords.longitude;
});
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果我们最小化浏览器或屏幕关闭,这不起作用 (5认同)

kcl*_*m06 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
Run Code Online (Sandbox Code Playgroud)

在 Chrome 中,您可以在工作线程中设置断点。我建议您针对错误执行此操作,这非常有帮助。