为什么这个JavaScript会被调用两次?

10

我有一个按钮,将其onclick钩在调用获取用户位置的方法上,然后再使用该位置来调用另一个方法以检索附近位置的列表。由于某种原因,在第二次单击按钮时,地理位置信息成功方法会被调用两次。

因此,我加载页面,单击按钮,允许使用我的位置,它将发出一个ajax请求以获取附近位置。这个运行良好。

我再次单击按钮,允许再次使用我的位置,它将发出一个ajax请求来获取位置,等待约2秒钟,然后使用相同的坐标再次发出另一个请求,而无需我允许权限。因此,成功方法必须被调用两次,但我不确定为什么会这样。

$("#FindLocation").click(function () {
  myScript.findNearbyLocations(displayData, displayError);
});

这个点击函数不会被调用两次,而且我已经将displayData和displayError中的所有代码都注释掉了。

findNearbyLocations: function (onSuccess, onFailure) {
  if (navigator.geolocation) {
    browserSupportFlag = true;
    navigator.geolocation.getCurrentPosition(function (position) {
      alert('This is getting called twice except on the initial call.');
      myScript.findStores(position.coords.latitude, position.coords.longitude, onSuccess, onFailure);
    }, function () {
      onFailure(true);
    });
  }
}

有没有人看出我哪里错了?

编辑:我不认为标记是问题所在。我只是在使用基本的网页进行测试。目前没有样式或其他元素。

<form id="form1" runat="server">
  <div>      
    <MyControls:Search ID="Search" runat="server" />
  </div>
</form>

并且用户控件(包括所有必要的javascript引用)

<script type="text/javascript">
  $(document).ready(function () {
    $("#FindLocation").click(function () {
      myScript.findNearbyLocations(displayData, displayError);
    });
  });
</script>

<input type="button" id="FindLocation" value="Find Location" />
<div id="results">
</div>

你的最后一行不应该是onFailure为false吗? - DOK
@DOK,这取决于他的onFailure方法对传递给它的参数执行了什么操作。 - CaffGeek
@DOK,不,该函数只接受浏览器是否支持navigator.geolocation功能。由于我们将其放入if语句中,我知道它被支持了,但用户可能已拒绝访问他们的位置。 - Brandon
你是否可能无意中在页面上有两个 id='FindLocation' 的元素?不应该允许有重复的ID,但 JQuery 可以处理并将为每个元素运行事件。 - Spudley
@Spudley,恐怕不行。这是一个空的网页,只有基本的html/head/body标签和一个用户控件。没有其他元素。用户控件只包含一个按钮和一个div来存放结果。 - Brandon
你们的服务器和认证结构是什么? - Aran Mulholland
4个回答

4

可能是你所使用的客户端getCurrentPosition存在错误。 在这种情况下,你可以在成功的方法被调用时设置一个标志,不允许第二次调用findStores函数。


2
每当我发现这种情况发生时,通常是因为我不小心将事件绑定到控件两次。如果代码...
$("#FindLocation").click(function () {
  myScript.findNearbyLocations(displayData, displayError);
});

如果绑定了两次相同的点击事件,就会发生两个相同的点击事件,并且动作会发生两次。


我把那段代码放在document.ready函数里。我不认为它被绑定了两次。在findNearbyLocations调用之前,我放了一个警告,每次只有第一次和随后的点击才会被调用一次。 - Brandon

2

1
+1 确认这是一个 bug。我想我会采用 wosis 的答案,只需传递一个标志即可。谢谢。 - Brandon

0

这是正在发生的事情,并且以可预测的频率发生;我在一个应用程序上工作时发现,当引发错误并且未被捕获时,在某个匿名函数中,它似乎终止了当前的Javascript会话,这就是开始发生的时候。这很令人沮丧和恼火;我知道为什么会发生,但我不知道它发生在哪里... 还没有找到。

但它确实发生了,所以只是一个快速的评论,所有“那不可能发生”的答案都不是非常准确或有帮助。

无论如何,这就是我的答案;您可能有一些内部函数抛出错误,而JQuery则在悄悄地吃掉它们。

$.02


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接