每秒更改红色和绿色之间的背景颜色

Jus*_*der 4 html javascript loops

我正在尝试使用JavaScript每隔一秒使网页更改背景颜色.我正在使用,setTimeout但我无法弄清楚如何让我的变量改变功能.这是我的代码:

 <!DOCTYPE html>
 <html>
     <head>
         <script type="text/javascript">
         function changecolors() {
             x = 1; // <-- I know this is wrong, I just don't know where to place it 
             var t = setTimeout("change()", 1000);
         }
         function change() {
             while(x < 3) {
                 if(x = 1) {
                     color = "red";
                     x++;
                 } else if (x = 2) {
                     color = "green";
                     x = 1;
                 }
                 document.body.style.background = color;
             }
         }
     </head>
     <body onload="changecolors()">
     </body>
 </html>
Run Code Online (Sandbox Code Playgroud)

Ry-*_*Ry- 14

这里有几个问题.我只修复你的代码:

var x;

function changecolors() {
    x = 1;
    setInterval(change, 1000);
}

function change() {
    if (x === 1) {
        color = "red";
        x = 2;
    } else {
        color = "green";
        x = 1;
    }

    document.body.style.background = color;
}
Run Code Online (Sandbox Code Playgroud)

基本上...

  • 你需要setInterval而不是setTimeout.setTimeout只执行一次.
  • =甚至在if声明中指定.你需要==(或更好===).
  • 你不应该将字符串传递给setTimeoutsetInterval.相反,传递一个函数.

另一点需要注意:您不应该on*将HTML元素的属性用于事件侦听器,尤其是不要使用<body>,因为您可以在JavaScript中执行此操作,并且不显眼:

window.onload = changecolors;
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用更少的功能并且不会污染全局命名空间.

  • @Landon:并不是说他们错了,但在大型项目中,当所有JavaScript,CSS和HTML分开时,通常会更容易理解.当你混合使用JavaScript和HTML时,它会变得混乱.当然,如果你正在测试,只能访问一个文件,或者正在做一个小型的个人项目,那也不算太糟糕. (2认同)

Gol*_*rol 6

眨眼小提琴:

http://jsfiddle.net/GolezTrol/R4c5P/1/

使用此功能:

function initBlink()
{
    var state = false;
    setInterval(function()
        {
            state = !state;
            var color = (state?'red':'green');
            document.getElementById('test').style.color = color;
        }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

使用闭包来保持状态不在全局范围内.使用setInterval而不是setTimeout进行重复调用,虽然这可能不方便.如果你愿意,setInterval和setTimeout都会返回一个你可以保存并用来停止计时器的句柄,但是由于你没有问过这个问题,为了简单起见,我把它留了下来.

该函数只定义了一个匿名回调,它可以切换布尔值并设置测试div的颜色.


boo*_*sey 5

另外,考虑使用CSS.演示.

@-webkit-keyframes blink {
        0%   { background:red; }
        50%  { background:green;}
        100% { background:red; }
}
@-moz-keyframes blink {
        0%   { background:red; }
        50%  { background:green;}
        100% { background:red; }
}
@-ms-keyframes blink {
        0%   { background:red; }
        50%  { background:green;}
        100% { background:red; }
}
body{
     -webkit-animation: blink 1s infinite;
     -moz-animation:    blink 1s infinite;
     -ms-animation:     blink 1s infinite;
}
Run Code Online (Sandbox Code Playgroud)