Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环中使用javascript呈现文本-浏览器没有响应_Javascript_Rendering_Real Time - Fatal编程技术网

在循环中使用javascript呈现文本-浏览器没有响应

在循环中使用javascript呈现文本-浏览器没有响应,javascript,rendering,real-time,Javascript,Rendering,Real Time,我有一个javascript,它会循环多次计算内容,每次迭代都会输出一些文本到屏幕上,但它会消失很长时间,并立即将所有内容刷新到屏幕上 可能有一些已知的技巧可以让事情迭代更新,而不是挂在输出上然后刷新,问题是我不知道它们 谢谢你的帮助 更新:我按照你们中的一些人的建议修改了我的代码以使用setTimeout,但我担心这没有帮助。在处理完成之前,我还是什么都看不到。我还尝试增加超时,但效果仍然相同(通过增加每次迭代之间的超时,显然需要更多的时间,但浏览器仍然没有响应)。有什么想法吗?您应该假设在代

我有一个javascript,它会循环多次计算内容,每次迭代都会输出一些文本到屏幕上,但它会消失很长时间,并立即将所有内容刷新到屏幕上

可能有一些已知的技巧可以让事情迭代更新,而不是挂在输出上然后刷新,问题是我不知道它们

谢谢你的帮助


更新:我按照你们中的一些人的建议修改了我的代码以使用setTimeout,但我担心这没有帮助。在处理完成之前,我还是什么都看不到。我还尝试增加超时,但效果仍然相同(通过增加每次迭代之间的超时,显然需要更多的时间,但浏览器仍然没有响应)。有什么想法吗?

您应该假设在代码运行时,屏幕上的视图不会更新(在最坏的情况下,甚至浏览器用户界面也会无响应)。您需要将处理分为多个步骤,并让浏览器偶尔处理一次事件。我不知道你的确切问题是什么,但这里有一个例子应该是接近的

var i = 0;

function count() {
  i++;
  document.getElementsById("log").innerHTML += i + "<br />";
  setTimeout(count, 1000);
}

count();
var i=0;
函数计数(){
i++;
document.getElementsById(“log”).innerHTML+=i+“
”; 设置超时(计数,1000); } 计数();
超时时间可能非常小。使用0的超时可以让浏览器处理事件,然后立即返回到代码。只需记住让浏览器处理事件的频率足够高,以便页面保持响应


最近有一些与之相关的工作,但这类工作还没有真正得到所有大型浏览器的支持。

这听起来像是预期的行为。JavaScript的运行速度可能快于浏览器呈现其输出的速度

听起来像是要显示操作的进度列表?也许您可以将它们全部显示在页面上,使用
display:none
并将它们切换到
display:block
可能会更快


或者,如果您不想要绝对精度,可以使用
setTimeout()

如果您只需要支持最先进的浏览器,那么使用setTimeout(),setInterval()是在javascript中实现等待/暂停功能的最佳方法。 下面是显示10个数字的示例程序,每个数字之间的时间间隔为100毫秒

<button id="startProgram" onclick="startProgram()">Start</button>
<div id="content"></div>
<script type="text/javascript"> 
function startProgram() {
var content = document.getElementById("content");
var string = "";
for(var i = 0; i < 10; i++) {
    string = string + i + "<br/>";
    setTimeout('display("' + string + '")', 100 * i);
}
}
function display(string) {
  content.innerHTML = string;
}
</script> 
开始
函数startProgram(){
var content=document.getElementById(“内容”);
var字符串=”;
对于(变量i=0;i<10;i++){
string=string+i+“
”; setTimeout('display('+string+'),100*i); } } 函数显示(字符串){ content.innerHTML=字符串; }

将此代码粘贴到一个空白的html文件中进行检查。

这肯定会起作用,我将不得不重新构造代码,但效果很好。出于好奇,smt不是类似于DoEvents()函数或类似函数吗?那就更好了,因为我不需要再做任何改变;)@约翰尼多:不,没有这样的功能。我把代码改成使用setTimeout,但恐怕没有用,在处理完成之前我还是看不到任何东西。我还尝试增加超时,但效果仍然相同(通过增加每次迭代之间的超时,显然需要更多的时间,但浏览器仍然没有响应)。有什么想法吗?我知道了,但我手头没有现成的东西,我正在计算东西,不知道会是什么。不需要绝对精度,所以我可能会使用setTimeout。谢谢。@JohnIdol祝你好运!请随时发布您的解决方案作为此问题的答案。感谢您的输入-虽然这似乎无法解决我的问题-请参阅更新。如果可以,请输入您的代码,以便我了解您到底在尝试做什么。