2013-04-09 46 views
0

我有一个html页面,并希望从java脚本函数打印一些值。价值需要经常改变。我的问题是,不是改变“持续”(或至少,当代码需要改变值时),只有当整个Java脚本代码完成执行时才会改变它。我使用的是Chrome,并未在其他浏览器上进行测试。从网页上的javascript打印值

下面是一个小例子,重现问题:

<head> 
    <title>Test Continuous Output</title> 
</head> 

<body> 
    <p id="data"></p> 

    <script> 
     function onClick() { 
      for(var i =0;i<100;i++) { 
       document.getElementById("data").innerHTML = i; 
       for(var j = 0; j < 1000; j++) { 
        console.log("j="+j); 
       } 
      } 
     } 
    </script> 
    <button onclick = "onClick()">test</button> 
</body> 

编辑:在这里张贴的代码解决这个问题,在@ Alytrem的建议使用的setTimeout:

<head> 
    <title>Test Continuous Output</title> 
</head> 

<body> 
    <p id="data"></p> 

    <script> 
    var n=0; 
    function log() { 
    document.getElementById("data").innerHTML = n; 
    n=n+1; 
    if(n<100) { 
    setTimeout(log,100); 
    } 
    } 

    function onClick() { 
    log(); 
    } 
    </script> 
    <button onclick = "onClick()">test</button> 
</body> 
+0

你看过'document.write' ..吗? – 2013-04-09 12:18:33

+0

@DipeshParmar我刚刚在我的代码document.getElementById(“data”)中替换。innerHTML = i通过document.write(i)。结果是在整个代码完成执行之前什么也没有发生,然后打印所有的数字。总之,这是同样的问题。 – S4M 2013-04-09 12:21:23

+0

http://stackoverflow.com/questions/3583724/how-do-i-add-a-delay-in-a-javascript-loop – 2013-04-09 12:28:12

回答

1

这是因为DOM会改变,但它需要重新粉刷。当dom重新绘制时,循环已经完成。尝试设置一个超时例如每100ms循环。 它将允许重新绘制DOM。

这是一个可能的解决方案,它使用setTimeout来避免在计算过程中阻止DOM重绘。

http://jsfiddle.net/n4YYX/4/

<body> 
<p id="data"></p> 
<script> 
    var remainingTasks; 

    function doTask() { 
     for (var j = 0; j < 1000; j++) { 
      1 + 1; 
     } 
     console.log("remainingTasks=" + remainingTasks); 
     document.getElementById("data").innerHTML = 100 - remainingTasks; 
     remainingTasks--; 
     if (remainingTasks > 0) setTimeout(doTask, 10); 
    } 

    function onClick() { 
     remainingTasks = 100; 
     doTask() 
    } 
</script> 
<button onclick="onClick()">test</button> 

+0

是的,我能够使用setTimeout修复它。谢谢! – S4M 2013-04-09 12:34:09

-1

文件撰写或警报()是我知道要输出的调试和东西 这样一个javascript变量值的唯一方式,例如:alert("j= "+j); < - 更好详细调试

或者:document.write("<br/> j="+j); < - 更适合快速调试

+0

这是不正确的,你应该使用console.log来注销你的网站上的消息(只在开发中,你应该删除它们的生产)。 – Undefined 2013-04-09 12:23:59

+0

我不想做调试,但向用户展示了一些工作的进度。而document.write不起作用。 – S4M 2013-04-09 12:27:30

+0

顺便说一下,我最近发现,通过在代码中输入“debugger”(不带引号),可以在某些java脚本代码中放置一个断点。也许它对你有用。 – S4M 2013-04-09 12:41:45