Javascript 如果iOS 6 js events函数中有setTimeout,则不调用该函数
我在最新的iOS(iOS 6)中注意到了这种奇怪的行为。如果为任何包含setTimeout的触摸事件调用函数,则setTimeout中的部分永远不会触发 仅当存在“系统动画”(如滚动和放大/缩小)时才会发生这种情况 例如:Javascript 如果iOS 6 js events函数中有setTimeout,则不调用该函数,javascript,jquery,ios,html,ios6,Javascript,Jquery,Ios,Html,Ios6,我在最新的iOS(iOS 6)中注意到了这种奇怪的行为。如果为任何包含setTimeout的触摸事件调用函数,则setTimeout中的部分永远不会触发 仅当存在“系统动画”(如滚动和放大/缩小)时才会发生这种情况 例如: setTimeout(function(){alert("HI")}, 1000); // using native setTimeout(function(){alert("HI")}, 1000, true); // using workaround (我使用jque
setTimeout(function(){alert("HI")}, 1000); // using native
setTimeout(function(){alert("HI")}, 1000, true); // using workaround
(我使用jquery只是为了测试,但纯js也是如此)
在任何iOS 6设备上使用safari打开该页面并放大或缩小。警报将永远不会被调用
如果在任何iOS5设备上进行测试,这将很好地工作!似乎在这些动画期间,操作系统会重置setTimeout或setInterval。这是预期行为还是错误
谢谢注意:UIWebView似乎不支持requestAnimationFrames。谢谢你指出这一点 我们正在开发的一个web应用程序也遇到了类似的问题 对我们来说,正是这一举动引发了问题。我们实现了一个变通方法(在这里找到:),它似乎工作得很好,直到另一个问题迫使我们放弃它。(我试着在你的小提琴上添加了变通方法,并且能够让计时器启动一两次,但它需要一个奇怪的手势+滚动事件,这几乎不可能持续地重现。) 无论如何,iOS 6为开发者提供的新功能之一是requestAnimationFrames。我的变通方法基本上是一个计时器包装器,允许开发人员传递一个布尔值,它将调用本机函数或变通方法函数 例如:
setTimeout(function(){alert("HI")}, 1000); // using native
setTimeout(function(){alert("HI")}, 1000, true); // using workaround
以下是使用此变通方法的其他方法:
setInterval(function(){console.log("Interval")}, 1000, true);
var timer = setTimeout(function(){ /* ... */ }, 60000, true);
clearTimeout(timer);
var interval = setInterval(someFunc, 10000, true);
if(someCondition) clearInterval(interval);
这里有两个解决方案示例。尝试在黑色方块上进行收缩/缩放:
(使用本机setTimeout
函数)
我们已经在生产环境中使用此解决方案几个月了,没有遇到任何重大问题
以下是解决方案的公开要点:
以下是有关requestAnimationFrames的更多信息:
祝你好运 谢谢你非常详细的回答,但正如你提到的,这不是解决我问题的正确方法。但现在,我认为这是iOS6中引入的一个bug,而不是一些新功能。对我来说,这似乎是一个解决方案。这是一个巨大的问题,确实让我头疼。更多的人需要看到这个解决方案嗨!在我的例子中(当webview被pullToRefresh时根本没有调用setTimeout),第一个有效()但第二个无效()。你遇到的第一个问题是什么?杰克,在几次提交后刚刚重新测试,现在一切似乎都正常。对不起,误报了!