这段代码假设在window.prompt()和document.write()之间来回转换,但是它会遍历所有window.prompt()消息并迭代,只要它必须,然后它转储所有文档.write输出在while循环的出口处。可以做些什么来回走动?
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>gasMilage</title>
<script type = "text/javascript">
var gasNow;
var distanceNow;
var mpgNow;
var gasOverall;
var distanceOverall;
var mpgOverall;
var answer;
answer = "yes";
gasOverall = parseInt(0);
distanceOverall = parseInt(0);
while(answer == "yes"){
gasNow = window.prompt(
"Enter the gallons of gas used: ")
gasNow = parseInt(gasNow);
distanceNow = window.prompt(
"Enter the distance traveled in miles: ")
distanceNow = parseInt(distanceNow);
mpgNow = parseInt(distanceNow / gasNow);
document.writeln(
"Your current mpg is " + mpgNow + "<br />");
gasOverall = gasNow + gasOverall;
distanceOverall = distanceNow + distanceOverall;
mpgOverall = parseInt(distanceOverall/gasOverall);
document.writeln(
"Your overall mpg is " + mpgOverall + "<br />");
answer = window.prompt(
"If you want to add more values, type yes.")
}
</script>
</head>
<body>
</body>
</html>
是的,这是因为提示进入得太快而且DOM没有时间写,因为有一个待处理的提示请求正在进行。解决这个问题的方法是在你的提示方法上加上超时。
但是,由于你在这里做了一个while循环,它将再次执行第一个提示而不等待超时。因此,不是while循环,只需将其包装在函数中,如果最后一个提示为是,则递归调用它。
试试这个fiddle
(function query() {
gasNow = window.prompt(
"Enter the gallons of gas used: ")
gasNow = parseInt(gasNow);
distanceNow = window.prompt(
"Enter the distance traveled in miles: ")
distanceNow = parseInt(distanceNow);
mpgNow = parseInt(distanceNow / gasNow);
document.writeln(
"Your current mpg is " + mpgNow + "<br />");
gasOverall = gasNow + gasOverall;
distanceOverall = distanceNow + distanceOverall;
mpgOverall = parseInt(distanceOverall/gasOverall);
document.writeln(
"Your overall mpg is " + mpgOverall + "<br />");
setTimeout(() => {
answer = window.prompt(
"If you want to add more values, type yes.")
if(answer === 'yes') query();
}, 1);
})()
在每个document.write之后,您可以添加延迟。这将为文档提供渲染时间。