Javascript Safari 8和7.1中的地理定位API不断请求许可

Javascript Safari 8和7.1中的地理定位API不断请求许可,javascript,safari,geolocation,w3c-geolocation,Javascript,Safari,Geolocation,W3c Geolocation,我已经将地理定位API构建到我的webapp中,所有浏览器都工作正常。除了Safari 8和7.1。浏览器在允许或不允许权限后不断请求权限,最终进入无限循环,使浏览器(选项卡)无法使用。它很容易复制,只要去野生动物园 这有什么解决办法吗?或者这只是Safari中的一个bug? 我搜索了一下,但找不到任何相关的东西 我不认为这是safari中的错误,您可以尝试以下示例,它对我很有效: 我们的团队也看到了这一点。起初,我们认为我们可能陷入了其他浏览器忽略的某种循环中,因此我们检测了代码并确认调用只发

我已经将地理定位API构建到我的webapp中,所有浏览器都工作正常。除了Safari 8和7.1。浏览器在允许或不允许权限后不断请求权限,最终进入无限循环,使浏览器(选项卡)无法使用。它很容易复制,只要去野生动物园

这有什么解决办法吗?或者这只是Safari中的一个bug? 我搜索了一下,但找不到任何相关的东西


我不认为这是safari中的错误,您可以尝试以下示例,它对我很有效:


我们的团队也看到了这一点。起初,我们认为我们可能陷入了其他浏览器忽略的某种循环中,因此我们检测了代码并确认调用只发生了一次。我们通过强制一个断点来暂停JavaScript,警报不断出现(不断出现,不断出现…)。在这一点上,我们非常确定问题不在我们的代码中

我一时兴起,将对地理定位API的调用放在一个
setTimeout
(允许调用堆栈清空)中,问题就消失了。不知道为什么这会解决问题

编辑


根据请求,我给出了一个示例@

Ok。因此,从@MeMTn和@chris camaratta的两个答案来看,以下是一些想法:

(一)

我一时兴起,将对GeolocationAPI的调用放在setTimeout内(以允许调用堆栈为空),问题就消失了。不知道为什么这会解决问题

我在我的angularjs应用程序中也做了同样的事情,而且效果很好。太好了

(二)


我不认为这是safari中的错误,您可以尝试以下示例,它对我很有效:

为什么(在Safari中!)没有设置超时

在我的angularjs应用程序中,对地理位置的调用是页面加载时首先发生的事情之一。我相信几乎所有其他应用程序/网页都是如此。在W3示例中,有一个可单击的按钮,当用户单击它时(当页面加载时)会触发对地理位置的调用

通过设置超时,我们允许Safari在几(毫秒)秒内处理其他一些事情(据我所知,这可能与调用地理定位API有关)

如果我将超时设置为<10,即使在本地主机上,错误也会回来。我想我现在会坚持100毫秒。但这对其他正常工作的浏览器来说是非常不公平的


无论是否有Bug,这显然与Safari有关。

我有两个确认对话框——一个来自浏览器,一个来自系统。当系统处于打开状态时,浏览器不会关闭。如果我在系统对话框中同意-我可以关闭浏览器。看起来像个虫子,我想也是个虫子。也许他们在约塞米蒂解决了这个问题?我也经历过这一点,并使用了W3学校的例子。它最多会请求四次我的位置,但这是最后一次生效的输入。为了解决这个问题,我还将我的函数包装在jQuery的
one()
中。我也遇到了这个bug,似乎无法解决这个问题。我没有在那个网站上不断请求权限。当你转到时会发生什么?我在htmldemos.com/geo上看到错误,但不是在这里。奇怪…来这里是因为搜索这个问题,这绝对解决了问题。谢谢同上。我已经与这个bug斗争了一段时间(起初它隐藏在另一个bug后面),但永远无法复制它。原来是这样的——一个团队成员现场直播了这件事,所以我背着它,看到了这种行为。这个回答澄清了问题。请注意,它也不总是发生……有没有比这更好的解决方案。为什么safari还没有解决这个问题呢。@大卫,因为safari和所有苹果产品都有同样的问题——除非被迫这么做。@Chris Hi mate,你能举一个简单的例子,说明你是如何在
setTimeout
中包装地理位置的,这样我就能知道如何设置它了吗?是的,这感觉像是safari中的一个bug。重申我前面的观点,用断点暂停JavaScript并没有阻止额外的弹出窗口(如果我们的代码有问题的话,人们会想到这一点)。在我们的例子中,当我们询问位置时,调用堆栈相当大;设置超时有效地清除了它。w3Schools示例也有一个小的调用堆栈,所以不管这是什么,Safari的调用堆栈处理显然是一个因素。