Web Workers中的HTML5 navigator.geolocation

我试图在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.");
    }
}

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

解决方法

我和你之前有过类似的问题,问了 a related question.现在我相信我的答案是你的问题(也是我的一个相关问题).

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

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

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

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

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些