navigator.geolocation.getCurrentPosition 有时有效,有时不起作用

2022-08-30 00:40:25

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

$(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

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


答案 1

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

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

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

若要确保获得超时,请将可选的第三个参数添加到调用以获取 CurrentPosition,例如,如果您希望用户在向他们提供发生什么的线索之前等待不超过 10 秒,请使用:

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

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

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

我无法理解这一点,但我怀疑后端基础设施比各种正在推动此功能的gung-ho书籍和网站中宣传的更不平衡。我真的希望他们能更直接地了解这个功能是多么的轻浮,以及超时设置有多重要,如果你想让你的错误处理程序正常工作

我今天一直试图把这些东西教给学生,并且遇到了尴尬的情况,我自己的电脑(在投影仪和几个大屏幕上)默默地失败了,而大约80%的学生几乎立即得到结果(使用完全相同的无线网络)。当我的学生也犯了错别字和其他失误,而我自己的电脑也失败了时,解决这些问题是非常困难的。

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


答案 2

这是我解决这个问题的黑客方式,至少它适用于所有当前的浏览器(在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上单击关闭或选择“不”或选择“从不共享”选项,这也将起作用。

笨拙,但它有效。