Javascript 如何暂停整个脚本,然后继续脚本
我有很多脚本,它们调用了几千次setTimeout()函数,基本上在画布上绘制动画线条。当然,它可以在计算机上运行,如果用户不触摸任何东西,它也可以在移动设备上运行。在这种情况下,我添加了一个touchstart事件监听器,当触摸任何东西时,它将启动整个动画(它们都大约30到40秒长)。又一次很好地工作了。问题是,几乎每个人都有移动设备屏幕变暗,然后在动画完成之前关闭,当然,当您看到屏幕变暗时,您触摸屏幕以防止其关闭,因此动画重新开始 我已经玩弄了clearTimeout()函数,我能做的最好的事情就是一次清除对它的所有调用,然后重新开始。这就是我所注意到的,我有时会在代码中抛出一个警报(无论什么)来调试它,我注意到当移动设备上弹出一个框时,它实际上会暂停整个javascript,包括所有数千个setTimeout调用,然后当你在警报框上按ok时,剧本从它停下来的地方继续快乐地进行着。这就是我想要的 问题是,是否有全局脚本暂停功能可以模拟一个警报框,该警报框将在触摸时暂停整个脚本(允许用户说滚动页面或填写文本框或其他内容),然后从停止的位置继续 只是在这里添加了一个抱怨:为什么在移动设备上滚动页面、缩放或简单单击一个显示键盘的文本框会影响setTimeout()函数的计时,它从一开始就被加载到内存中,时间是绝对的,它一直在运行,毫无意义Javascript 如何暂停整个脚本,然后继续脚本,javascript,Javascript,我有很多脚本,它们调用了几千次setTimeout()函数,基本上在画布上绘制动画线条。当然,它可以在计算机上运行,如果用户不触摸任何东西,它也可以在移动设备上运行。在这种情况下,我添加了一个touchstart事件监听器,当触摸任何东西时,它将启动整个动画(它们都大约30到40秒长)。又一次很好地工作了。问题是,几乎每个人都有移动设备屏幕变暗,然后在动画完成之前关闭,当然,当您看到屏幕变暗时,您触摸屏幕以防止其关闭,因此动画重新开始 我已经玩弄了clearTimeout()函数,我能做的最好的
谢谢你的阅读。令人困惑的人,有很多东西要读。我仍然感到困惑,我认为你需要一些东西,不断地检查它是否需要抛出警报,或者你是否抛出警报。暂停某事直到警报消失 您将使用一个循环函数,该函数仅在alert=false或sleep=false时运行
var sleep = false;
function main() {
if (!sleep) {
// We run the script
// Throw alert
// Sleep now = true, because we threw alert
sleep = true;
} else if (sleep == true) {
// Pause
// Re-run when sleep is not false;
main();
} else {
//whatevs
}
或
当/如果屏幕进入睡眠状态,“全局暂停”将在所有浏览器(除Firefox外)上自动发生。(我认为Firefox的行为是一个bug,是一种永久性的唤醒锁)
您可以检测可见性是否已随以下内容而更改:-
document.addEventListener("visibilitychange", visibilityChange);
这对初始dim没有帮助,但我建议您只需触摸事件,在返回开始并重新初始化之前请求重新启动确认。您是说
setTimeout()
在代码中出现数千次?如果是这样,我会重新构造它,将关于每个步骤的所有信息放在一个数组中,然后使用一个知道如何从数组中绘制下一个内容的函数,并使用setTimeout()
调用自身来执行下一步。如果要暂停整个过程,您只需担心一个函数。不,setTimeout有两个循环,首先是为要绘制的每一整条直线、圆弧或圆设置一个循环,然后将每个循环传递给另一个setTimeout循环,该循环一次绘制上述直线、圆弧或圆的每个像素。画布是800x800,平均线路长度是400,实际线路大约有100条,这就是4000个SetTimeout调用,这也是一个很小的调用。时间都是从一开始就计算出来的,并放入一个数组中,我很震惊它工作得如此之好。@JohnH checkout的官方答案我想你需要的是这个答案中的睡眠函数脚本,它利用了Promise功能。。你试图解决问题的错误部分。真正的问题是,当用户滚动时,您的代码无法正常工作。这很可能是由于性能问题,而性能问题本身可能是由于编码问题。如果看不到您的代码和密码,我们就不可能正确地帮助您。但是,从你所说的,你已经得到了如何做一个视觉动画部分完全错误。不要使用多个setTimeout
,而是使用单个requestAnimationFrame
循环。这个基本错误只告诉我们可能还有什么其他错误…哦,谢谢你,我从来没有在任何研究中见过requestanimationframe循环,这是很多,当我开始编写这个时,难以置信。我不知道如何建立链接,但这是一个简单明了的解决方案。==
或=
,而不是=
在您的条件下的=
。但是你可以说,if(!sleep){…}else{…}
。是的,很晚了。你只是用那些无限循环冻结了浏览器。经过一定数量的循环后,它将发出抱怨。
document.addEventListener("visibilitychange", visibilityChange);