0

我遇到了 GeoLocation API 的问题。基本上,我正在尝试根据用户的位置链接到谷歌地图(非嵌入)。如果无法使用地理位置,则默认仅显示目的地。我遇到的问题是,除非我在代码中放入警报,否则它将始终默认为仅目的地。

这是我的代码:

  function findPosition(position)
  {
    var latitude = position.coords.latitude;
    var longitude = position.coords.longitude;

    mapURL = "https://maps.google.co.uk/maps?saddr=" + latitude + "," + longitude + "&daddr=50.795251,-1.107136&sensor=TRUE";

    alert("1 " +  mapURL); // Alert shows the URL correctly
  }

  if(navigator.geolocation)
  {
    navigator.geolocation.getCurrentPosition(findPosition);
  }

  alert("2 " +  mapURL); // Shows empty string as if findPosition() has not been called???
  alert("3 " +  mapURL); // Shows mapURL correctly

  if (mapURL == "")
  {
    // Set the default URL with only the destination
    mapURL = "https://maps.google.co.uk/maps?q=50.795251,-1.107136";
  }

  var link = "<a href=\"" + mapURL + "\" style=\"text-decoration:none;color:#000;\" target=\"_blank\">";

  document.write(link);
//-->
</script>

警报旁边的注释是为了演示代码如何与它们一起工作,但是如果警报被删除,它总是会设置目标唯一的默认 URL。

我不明白为什么警报 1 显示正确的 URL 而 2 却什么也没显示,尽管它应该在警报 1 之后处理?

任何帮助,将不胜感激。

4

1 回答 1

1

发生这种情况是因为navigator.geolocation.getCurrentPosition它是异步的,因此一种解决方案是向它传递一个回调,就像您所做的那样,当找到位置(或抛出错误时)将调用该回调。

您使用 s 看到了正确的结果,alert因为您给脚本时间来识别位置。

一种解决方案可能是将代码移动到您navigator.geolocation.getCurrentPosition调用的回调中findPosition,如下所示:

function findPosition(position) {
  var latitude = position.coords.latitude;
  var longitude = position.coords.longitude;

  mapURL = "https://maps.google.co.uk/maps?saddr=" + latitude + "," + longitude + "&daddr=50.795251,-1.107136&sensor=TRUE";
  if (mapURL == "") {
    // Set the default URL with only the destination
    mapURL = "https://maps.google.co.uk/maps?q=50.795251,-1.107136";
  }

  var link = "<a href=\"" + mapURL + "\" style=\"text-decoration:none;color:#000;\" target=\"_blank\">";
  document.write(link);
}  

if(navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(findPosition);
}
于 2013-06-05T09:10:25.063 回答