为什么html页面在javascript末尾提示后呈现document.write

为什么html页面在javascript末尾提示后呈现document.write,javascript,html,Javascript,Html,我是JS新手,下面有一段javascript代码片段: <script type="text/javascript"> var eatSteak = confirm ("Do you eat steak?"); if (eatSteak) { document.write("Here's a Steak!"); }else{ document.write("Here's a Tofo!"); } var happy = prompt ("Are you happy?"

我是JS新手,下面有一段javascript代码片段:

<script type="text/javascript">
var eatSteak = confirm ("Do you eat steak?");
if (eatSteak) {
    document.write("Here's a Steak!");
}else{
    document.write("Here's a Tofo!");
}
var happy = prompt ("Are you happy?");
</script>

var eatSteak=确认(“你吃牛排吗?”);
如果(吃牛排){
记录。写下(“这是牛排!”);
}否则{
文档。写下(“这是Tofo!”);
}
var happy=prompt(“你快乐吗?”);
当我在chrome中调试代码时,我看到“是”确认弹出窗口。它点击代码“document.write(“这是牛排!”);”,HTML页面显示“这是牛排!”,然后代码点击提示弹出窗口


让我非常困惑的是,当我在chrome中运行它时,“这是牛排!”只有在弹出提示后才会显示。似乎document.write仅在javascript代码执行后生效?还是HTML在javascript之后开始呈现页面?我在谷歌上搜索过,但找不到类似的问题或答案。

这是单线程javascript模型的本质。作为一个提示、警报等,会在您做出决定之前停止执行,之前进行的任何DOM操作都会等待您超出当前范围。这在不同的浏览器中可能有所不同,但这取决于DOM操作的实现方式

下面的脚本将阻止红色,直到您单击OK(至少在Chrome上,在Firefox上,我惊讶地发现它不起作用:D)

将颜色设置为绿色进行操作,然后启动计时器,在下一个可能的时间使用setTimeout显示警报。这将确保在显示警报之前(在任何浏览器中)设置为绿色

//在退出函数之前阻止调用(至少,在Chrome上,firefox似乎可以工作)
函数setColorToRed(){
document.body.style.background='red';
警报(“确定后会出现红色”);
}
//无阻塞调用,适用于所有浏览器
函数setColorToGreen(){
document.body.style.background='绿色';
setTimeout(函数(){
警报(“应设置绿色”);
}, 0);
}
阻止红色呼叫

None-blocking call green
“当我在chrome中运行它时,”这是一块牛排!“仅在弹出提示后显示。”-您的意思是它仅在第二次(“您高兴吗?”)提示后显示?一般来说,当JS运行时,浏览器不会重新绘制屏幕。如果你是javascript新手,那么就远离
文档。编写
,正如它所做的那样,只需学习如何操作DOMWell,confirm要求你确认-为什么你认为它应该在这之前编写任何东西?代码如何知道您将选择什么?@nnnnnn,是的,我觉得在第二次提示之后的页面呈现是单线程javascript模型的本质。作为一个提示、警报等,会在您做出决定之前停止执行,之前进行的任何DOM操作都会等待您超出当前范围。这在不同的浏览器中可能有所不同,但这取决于document.write的实现方式感谢您的陷阱链接和代码片段。所以,当JS看到document.write这样的DOM操作时,它不会立即调用,而是会等待并查看它之后是否有提示/警报?如果有,document.write将等待提示退出。我也在IE中测试了你的代码,红色不阻塞。@Richard实际上,代码应该在一个警报/确认时停止,直到用户做出动作(关闭对话框,单击“确定”或“取消”)。一旦执行可以继续,浏览器将处理其队列中挂起的更改。感谢您测试它(即,我的家用电脑上没有Windows:)