在我添加此代码之前,Safari iOS iOS 5上的一切正常:
var watchID = navigator.geolocation.watchPosition(updatePos,locationError,{maximumAge: 10000, frequency: 60000, enableHighAccuracy: true, timeout: 1000});
function updatePos(position) {
if (position.coords.accuracy < accuracyThreshold) {
$.post(websiteRoot + '/ReportDeviceLocation?rand=' + (Math.random() * Math.random()) + '&longitude=' + position.coords.longitude + '&latitude=' +position.coords.latitude);
} else {
console.debug("Location data is not accurate enough. Location not updated.");
}
}
然后网页工作了大约4分钟,我收到了这个错误:
JavaScript执行超时超时。
然后不会加载JavaScript。我插入到my.js文件中的调试消息都不会打印出来。只有上面的错误。
即使在我离开生成此错误的网页并在同一域下打开其他网页后,错误仍然存在。
我使用了try和catch,我使用了setTimeout函数,但既没有给出错误的来源也没有解决问题。
我不知道问题所在。它一整天都在燃烧我,并会在周末燃烧我。
答案 0 :(得分:6)
令人惊讶的是,当我使用geolocation.getCurrentPosition
时,错误消息停止显示。
要使用getCurrentPosition替换watchPosition,我使用函数setInterval
:
function getLocation() {
navigator.geolocation.getCurrentPosition(updatePos, locationError, { enableHighAccuracy: true, timeout: 10000 });
}
var intervalID = window.setInterval(getLocation, 10000);
这比watchPosition效果更好,因为watchPosition有时不遵循规则(尽管频率设置为10分钟,但在3分钟内更新位置8次)。
如果仍然发生超时,则需要调用clearInterval:
var geolocationID;
(function getLocation() {
var count = 0;
geolocationID = window.setInterval(
function () {
count++;
if (count > 3) { //when count reaches a number, reset interval
window.clearInterval(geolocationID);
getLocation();
} else {
navigator.geolocation.getCurrentPosition(updatePos, locationError, { enableHighAccuracy: true, timeout: 10000 });
}
},
600000); //end setInterval;
})();
答案 1 :(得分:2)
正如附录一样:
这个问题也存在于iPhone上(并不奇怪),但仍然没有修复。更糟糕的是,如果你退出(而不是杀死)浏览器,你会得到一个电池滤水器,在12小时内手机就会死机。不幸的是,我需要依赖手表,因为getCurrentPosition到目前为止还不够准确。
一旦错误发生(在报告的~4分钟之后),就会每秒报告一次执行超时错误,并且JS引擎已经死亡。问题是它不是执行超时。这就是错误,即使网站重新加载也不会改变它,停止/启动手表也无济于事。只有杀死浏览器(双击按钮,长按图标,然后 - )才能解决问题。
似乎我们注定要失败,直到苹果发布修复......
更新:在对此进行更多实验之后,似乎问题是XHR请求,可能是jquery特定的,似乎对这些请求有一些限制或没有适当的清理。超时错误将在任何其他站点以及第一个XHR被触发时弹出。在所有JS运行正常之前。
答案 2 :(得分:1)
我在同样的问题上挣扎,找到了一个非常优雅的解决方案。
当我使用navigator.geolocation.watchPosition启动“跟随位置模式”并在不停止的情况下重新加载页面时发生超时错误。所以我可以通过在用户离开页面时清除观察者来解决这个问题。
$(window).unload(function(){
window.navigator.geolocation.clearWatch(myWatchHandler);
});
希望这有帮助!
答案 3 :(得分:1)
我正在使用watchPosition回发我的长期,最重要的速度。我在这个帖子中遇到了与用户相同的问题:iOS上的Safari / Chrome杀死了GPS提要(这不是停止的间隔,我测试过)。只有通过杀死浏览器(如双击主页按钮),我可以让它再次工作几秒钟。我尝试了所有的东西,比如清除间隔,但它没有用。然后,我出去了,继续工作!回到里面,GPS信号消失了。由于像RunKeeper这样的应用程序继续在内部工作,我认为它也能在内部工作,但结果证明是wrong。如果有人有任何疑问,请随时提出。
答案 4 :(得分:0)
在另一个标签页或网站中运行watchPosition时,可能会阻止所有getCurrentPosition的Safari问题。
答案 5 :(得分:0)
我有类似的问题,我也使用html5地理定位。
我已经实施了建议的setInterval()
解决方案。虽然需要更长的时间,但同样的问题仍然存在。
我通过在我的代码中添加以下代码段来做一些实验,只是为了“暂停”代码执行:
ms = 30000;
ms += new Date().getTime();
while (new Date() < ms){
}
上面的代码段可靠地生成javascript执行超时。我偷偷地发现下一个片段也会产生超时。但似乎浏览器能够从超时中恢复。不要问我为什么。它只是有效。我希望受影响的人能够核实我的发现。
ms = 30000;
ms += new Date().getTime();
while (new Date() < ms){
if (new Date() %100 == 0){
console.log('in while');
}
}
所以,解决方案似乎,看起来很简单,应该将console.logs添加到最常调用的代码部分。我希望这可能会有所帮助(虽然我觉得它看起来很荒谬,但它对我有用)