【问题标题】:Why is this javascript getting called twice?为什么这个javascript被调用两次?
【发布时间】:2011-06-05 08:53:15
【问题描述】:

我有一个按钮,我将 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,这取决于他的onFailure 方法对传递给它的参数做了什么。
  • @DOK,不,该功能只接受浏览器是否支持 navigator.geolocation 功能。由于我们将其放入 if 语句中,我知道它是受支持的,但用户可能拒绝使用他们的位置。
  • 您会不会无意中在页面上有两个带有id='FindLocation' 的元素?它不应该被允许有一个重复的 ID,但是 JQuery 会处理它并且会为它们中的每一个运行事件。
  • @Spudley,不用担心。这是一个带有基本 html/head/body 标签和用户控件的空网页。没有其他元素。用户控件只包含一个按钮和一个用于转储结果的 div。

标签: javascript jquery geolocation


【解决方案1】:

这正在发生,而且以可预测的频率发生;我在我现在正在开发的一个应用程序中发现的是,当一个错误被引发但没有被捕获时,在某个匿名函数中的某处出现来终止当前的 Javascript 会话,那就是它开始发生。这令人沮丧和烦人;我知道为什么会发生这种情况,但我不知道发生在哪里......但是。

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

无论如何,这就是我的答案;你可能有一些内部函数抛出一个 JQuery 正在悄悄吃掉的错误。

$.02

【讨论】:

    【解决方案2】:

    可能是您使用的任何客户端的getCurrentPosition 中的错误。 在这种情况下,您可以在调用成功方法时简单地设置一个标志,并且不允许第二次调用 findStores 函数。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,这似乎是一个浏览器错误(在 Firefox 和 Safari 中测试)。我只是验证了我是否已经在最近的时间范围内检索到相同的数据,类似于这里的回答:navigator.geolocation.getCurrentPosition sometimes works sometimes doesn't

      Google 中有更多问题但没有明确答案:http://www.google.nl/search?q=geolocation.getCurrentPosition+called+twice&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a

      【讨论】:

      • +1 用于确认这是一个错误。猜猜我会选择 wosis 的答案,然后传入一个标志。谢谢。
      【解决方案4】:

      每当我发现这种情况发生时,都是因为我不小心将事件绑定到控件两次。

      如果代码

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

      碰巧运行两次,你会绑定两个相同的点击事件,动作会发生两次。

      【讨论】:

      • 我在 document.ready 函数中有该代码。我不相信它会被绑定两次。我在 findNearbyLocations 调用之前放置了一个警报,它每次只在第一次和后续点击时被调用一次。
      猜你喜欢
      • 1970-01-01
      • 2012-04-23
      • 2021-07-13
      • 2021-11-25
      • 2015-12-24
      • 2012-12-10
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多