2016-11-07 44 views
-2
document.write('Test.'); 
while (true) 1; 

我希望浏览器先显示文本,然后跳入无限循环。但我没有看到任何文字。如何强制浏览器一行一行?我正在寻找一个简单的函数,告诉浏览器等待第一行完成。有这样的事吗?像waitForEverythingToFinish()。就像使用window.getComputedStyle(div).getPropertyValue('height')强制重绘一样。如何使文字显示?

+2

甚至在浏览器尝试“显示”之前,浏览器进入无限循环并停滞。请不要使用'document.write()'。 –

+0

这怎么改变?这只是一个非常简单的问题说明。真正的代码不包含任何'document.write()'。 –

+1

@TamásBolvári不要这样做?你为什么想要拖延浏览器?该标签将崩溃。 – Brad

回答

1

我相信这个问题,根据您的评论的本质,是要确保浏览器有时间来更新屏幕启动一个长时间运行同步任务之前。浏览器会在屏幕更新时更新屏幕,因此如果屏蔽了主线程,则无法获取刷新的用户界面。这应该是可能的,只需一个简单的超时时间,或根据意见建议,​​。

简单超时:

// For example, document.write(...) 
funcThatChangesScreen(); 

setTimeout(function() { 
    // For example, lots of heavy calculations 
    synchronousFuncThatTakesALongTime(); 
}, 100); 

的jsfiddle比较:

或查看requestAnimationFrame

编辑:正如评论中的其他人所指出的,这并不是真正实现你想要的最好的方式,即使它确实有效。如果您有一个长时间运行的同步任务,最好将其委托给WebWorker或使其异步。这个超时解决方案将允许用户在屏幕上看到文本,但它仍然会阻止用户界面,就像上面的JSFiddles一样。

+0

为什么浏览器无法在我想要的时候更新屏幕,它在等什么?无论等待什么,都应该有办法阻止它。它甚至不是很忙,当我问它'document.write('Test。');'。无论如何,你已经完美地回答了我的问题,但是你可以添加这个:[使用requestAnimationFrame](https://jsfiddle.net/ruLf0rkg/2/)? –

+1

@TamásBolvári - 浏览器一次只能做一件事,包括画屏供用户看。浏览器试图通过等待,直到他们没有其他任何事情来刷新屏幕UI为止 - 否则,在几乎每一行代码之后不断的重新绘制会让一切变得更慢。欲了解更多信息,请参阅[在JS多线程这个答案](http://stackoverflow.com/questions/7909593/is-it-possible-to-thread-javascript-and-keep-access-to-the-ui)。 requestAnimationFrame的讨论是[here](https://css-tricks.com/using-requestanimationframe/)。 –

-1

看看这个工作是为了你的目的?

if(!document.write('Test.')){ 
    while (true) 1; 
} 
+0

不幸的是,它没有。 –