除非我包含显示/延迟脚本的警报,否则javascript geolocation无法正常工作

时间:2013-06-05 08:56:58

标签: javascript html5 geolocation alert

我遇到了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显示正确的网址但是2什么都没有显示,尽管它应该在警报1之后处理?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是因为navigator.geolocation.getCurrentPosition是异步的,所以一个解决方案就是将回调传递给它,就像你所做的那样,当找到位置时(或者当它发出错误时)将调用它。

您使用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);
}