我试图在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.idl和WorkerNavigator.idl中.您可以看到它们是.idl文件中的两个独立接口.并且它们在绑定的C端具有独立的实现. Navigator是DOMWindow的属性,而WorkerNavigator是WorkerGlobalScope的属性.
但是,在JavaScript方面,它们具有相同的名称:navigator.由于两个导航器位于两个不同的范围内,因此没有名称冲突.但是当在JavaScript中使用API时,如果主线程和工作线程具有相同的名称,人们通常会期望类似的行为.这就是歧义发生的方式.