【问题标题】:HTML5 navigator.geolocation in Web WorkersWeb Workers 中的 HTML5 navigator.geolocation
【发布时间】:2012-07-18 03:24:06
【问题描述】:

我正在尝试在网络工作者中移动我的 navigator.geolocation 代码。

我在 Chrome 和 Safari 上尝试过,但在

上显示“未定义”

var 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.");
    }
}

任何关于错误的提示将不胜感激。

【问题讨论】:

    标签: html geolocation gps web-worker


    【解决方案1】:

    我之前有过和你类似的问题,问过a related question。现在我相信我已经回答了您的问题(以及我的一个相关问题)。

    navigator.geolocation 只属于主线程中的navigator,不属于工作线程中的navigator。

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

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

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

    【讨论】:

      【解决方案2】:

      支持“导航器”对象,但它只包含四个属性:appName、appVersion、userAgent 和平台。

      通过查看您的代码,您似乎正在尝试跟踪用户位置的变化。您不必使用网络工作者来完成此操作。您可以简单地使用 watchPosition() 在主线程上监视用户的位置,当用户位置发生变化时,它会自动通知回调函数:

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

      【讨论】:

      • 但是如果我们最小化浏览器或者屏幕熄灭,这不起作用
      【解决方案3】:

      在 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 中,您可以在工作人员中设置断点。我建议为您的错误执行此操作,它非常有帮助。

      【讨论】:

        【解决方案4】:

        将主线程 postMessage() 中的 watchPosition(success) 设置为 webWorker 的新位置还不够吗?

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
        • Ashish,答案在上面的第一行。这些链接提供了未来解决方案应该是什么的背景。干杯理查德
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 1970-01-01
        相关资源
        最近更新 更多