navigator.geolocation.getCurrentPosition 有时有效有时无效

IT技术 javascript jquery geolocation
2021-01-14 15:18:37

所以我有一个使用 navigator.geolocation.getCurrentPosition jammy 的非常简单的 JS。

$(document).ready(function(){
  $("#business-locate, #people-locate").click(function() {
    navigator.geolocation.getCurrentPosition(foundLocation, noLocation);
  });

  navigator.geolocation.getCurrentPosition(foundLocation, noLocation);

  function foundLocation(position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    var userLocation = lat + ', ' + lon;
    $("#business-current-location, #people-current-location").remove();
    $("#Near-Me")
      .watermark("Current Location")
      .after("<input type='hidden' name='business-current-location' id='business-current-location' value='"+userLocation+"' />");
    $("#people-Near-Me")
      .watermark("Current Location")
      .after("<input type='hidden' name='people-current-location' id='people-current-location' value='"+userLocation+"' />");
  }
  function noLocation() {
    $("#Near-Me").watermark("Could not find location");
    $("#people-Near-Me").watermark("Could not find location");
  }
})//end DocReady

基本上这里发生的事情是我们获得当前位置,如果获得了,两个“水印”被放置在两个显示“当前位置”的字段中,并使用经纬度数据创建两个隐藏字段作为它们的值(它们被删除在开始时,所以它们不会每次都被复制)。还有两个按钮具有与它们相关联的单击功能,可以执行相同的操作。不幸的是,每隔大约三次,它就会起作用。这里有什么问题???

6个回答

我一直遇到完全相同的问题,并且在网上几乎找不到有关它的信息。书里什么都没有。最后,我在 stackoverflow 上找到了这个清醒的查询,(哈!)这是我在这里设置帐户所需的最后动力。

我有一个部分的答案,但可惜不是一个完整的答案。

首先,要意识到getCurrentPosition默认超时时间无限的(!)。这意味着如果 getCurrentPosition 挂在后端某处,您的错误处理程序将永远不会被调用

为确保您获得超时,请将可选的第三个参数添加到您对 getCurrentPosition 的调用中,例如,如果您希望用户等待不超过 10 秒才能向他们提供正在发生的事情的线索,请使用:

navigator.geolocation.getCurrentPosition(successCallback,errorCallback,{timeout:10000});

其次,我在不同的环境中体验到了完全不同的可靠性。在家里,我会在一两秒内收到回调,尽管准确性很差。

然而,在工作中,我遇到了非常奇怪的行为变化:地理定位一直在某些计算机上工作(当然,IE 除外),其他人只能在 chrome 和 safari 中工作,但不能在 firefox 中工作(壁虎问题?),其他人工作一次,然后随后失败 - 并且模式每小时都在变化,每天都在变化。有时你有一台“幸运”的电脑,有时没有。也许在满月时宰杀山羊会有所帮助?

我一直无法理解这一点,但我怀疑后端基础设施比推动此功能的各种热门书籍和网站中宣传的更不平衡如果您希望错误处理程序正常工作,我真的希望他们能更直接地了解此功能的重要性,以及超时设置的重要性

我今天一直在尝试向学生教授这些东西,遇到了我自己的计算机(在投影仪和几个大屏幕上)无声无息地失败的尴尬情况,而大约 80% 的学生几乎立即得到了结果(使用完全相同的无线网络)。当我的学生也出现拼写错误和其他失误,以及我自己的电脑也出现故障时,这些问题就很难解决。

无论如何,我希望这对你们中的一些人有所帮助。感谢您的健康检查!

了解timeout选项中getCurrentPosition()的实际时间是很重要的它不计时用户允许或拒绝地理定位请求,而是允许网络在授予权限后返回位置的时间。如果用户不回答地理定位请求,则永远不会调用错误处理程序。因此,您需要第二次超时,如@xiaohouzi79 的回答。
2021-03-17 15:18:37
只是我的观察,API 在隐身选项卡上不起作用
2021-03-21 15:18:37
满月宰羊会有帮助吗?哈哈
2021-03-24 15:18:37
不错,我遇到了同样的问题(在三星 Galaxy Tab,10.1,运行 Android 4.0.3 上),一旦我使用了上面的超时参数,我就能够处理这个问题。
2021-03-28 15:18:37
好详细的资料,谢谢!我看到了同样的问题,但仅限于 Firefox 3.6.13。Chrome 似乎非常可靠。
2021-04-03 15:18:37

这是我解决这个问题的hacky方式,至少它适用于所有当前浏览器(在Windows上,我没有Mac):

if (navigator.geolocation) {
    var location_timeout = setTimeout("geolocFail()", 10000);

    navigator.geolocation.getCurrentPosition(function(position) {
        clearTimeout(location_timeout);

        var lat = position.coords.latitude;
        var lng = position.coords.longitude;

        geocodeLatLng(lat, lng);
    }, function(error) {
        clearTimeout(location_timeout);
        geolocFail();
    });
} else {
    // Fallback for no geolocation
    geolocFail();
}

如果有人在 Firefox 上单击关闭或选择否或选择从不共享选项,这也将起作用。

笨重,但它的工作原理。

甜蜜 - 如果有人选择不共享位置,计时器会很好地工作。当用户这样做时,某些浏览器不能很好地发挥作用。这个计时器解决方法在我的 Store Locator Plus WP 插件上效果很好!
2021-03-28 15:18:37
抱歉,它起作用了。但我找不到使它起作用的原因。关闭并重新打开 FF 后它的工作......感谢你的解决方案......
2021-04-02 15:18:37
+1 但是您缺少geolocFail();错误处理程序和getcodeLatLng();地理编码器。
2021-04-03 15:18:37
你不应该在字符串中使用函数。邪恶的 eval 在那里毫无意义地工作。setTimeout("geolocFail()", 10000);
2021-04-07 15:18:37
@sajith - 不确定这个解决方案现在是否在最近的 FF 浏览器中已经过时。它在我提供解决方案时起作用,因为我需要它用于我正在处理的站点。你测试过吗?
2021-04-08 15:18:37

这每次都对我有用:

navigator.geolocation.getCurrentPosition(getCoor, errorCoor, {maximumAge:60000, timeout:5000, enableHighAccuracy:true});

虽然不是很准确。有趣的是,在同一台设备上,如果我运行它,它会让我离开大约 100 米(每次),但是如果我去谷歌的地图,它会准确地找到我的位置。因此,尽管我认为 enableHighAccuracy: true 有助于它始终如一地工作,但它似乎并没有使它更准确......

100 米外是我所依附的手机信号塔。所以它返回的是手机信号塔的位置,而不是我的手机。如果我在外面让 GPS 启动,可能会更准确。
2021-03-17 15:18:37
我在返回 Observable 的 Angular Resolver 中使用了这个 getCurrentPosition。解析器只是间歇性地完成。添加这些选项:{maximumAge:60000, timeout:5000, enableHighAccuracy:true} 使它每次都能工作!!!
2021-03-18 15:18:37
这已阻止 Firefox 拒绝请求并发回超时对象。
2021-03-22 15:18:37
由于您将maximumAge 参数设置为60 秒,因此它总是让您远离几米。所以它把你的位置放在你 60 秒前的位置。将maximumAge 设置为10 秒或更短(maximumAge:10000),然后重试。
2021-03-25 15:18:37

这已经是一个老问题了,但是所有的答案都没有解决我的问题,所以让我们添加我最终找到的一个。它闻起来像一个黑客(它是一个),但在我的情况下总是有效。希望你的情况也一样。

//Dummy one, which will result in a working next statement.
navigator.geolocation.getCurrentPosition(function () {}, function () {}, {});
//The working next statement.
navigator.geolocation.getCurrentPosition(function (position) {
    //Your code here
}, function (e) {
    //Your error handling here
}, {
    enableHighAccuracy: true
});
这是最骇人听闻的技巧,我不知道你是怎么想到要尝试的,但它解决了我的问题。谢谢!
2021-03-14 15:18:37
我自己在某些情况下使用过这个。根据我的经验,第二次尝试总是效果更好
2021-04-05 15:18:37

这里的人也是一样,顺便说一句,这在 Chrome(稳定版、开发版和 Canary 版)中很完美,只是在 FF 和 Safari 中不行。它也适用于我的 iPhone 和 iPad(Safari!)。这可能是由于此功能相对较新(即它是一个错误)。我现在花了将近一个星期的时间,但我无法让它在那些浏览器上运行

这是我发现的:

第一次调用 getCurrentPosition 时,它工作得很好。任何后续调用都不会返回,即它不会触发 successCallback 或 errorCallback 函数。我在电话中添加了一些头寸选项来证明我的观点:

 navigator.geolocation.getCurrentPosition(successCallback, errorCallback,  {timeout: 10000});

并且每次都超时(在第一次成功调用之后)。我以为我可以用maximumAge修复它,但这似乎不起作用,因为它也应该起作用:

navigator.geolocation.getCurrentPosition(successCallback, errorCallback,  {maximumAge:60000, timeout: 2000});

如果您在 60 秒内调用它,这应该会阻止实际调用 getCurrentPosition 函数,但它会忽略这一点(但是,这可能是因为我实际上刷新了我的页面以触发第二次调用,不确定这是否是持续的跨调用)

顺便说一句,即使谷歌的例子在这些浏览器上也失败了,这让我相信这确实是浏览器的错误,试试看,在 Safari 中加载两次,第二次就不行了。

如果有人为此找到解决方案,请告诉我:-)

干杯。

我有和你一样的确切问题,它适用于第一次调用,但不适用于下一次调用,如果有人找到解决方案,我会非常感兴趣......@xiaohouzi79 你的解决方案每次都在 geolocFail( 除了第一个) 结束(除了第一个) )
2021-03-24 15:18:37