Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';我的方式有问题;我正在使用setInterval()?_Javascript - Fatal编程技术网

Javascript 什么';我的方式有问题;我正在使用setInterval()?

Javascript 什么';我的方式有问题;我正在使用setInterval()?,javascript,Javascript,我想打印一个段落,其中包含一个使用JavaScript setInterval方法每秒动态更改的术语 变化的术语在我想要迭代的数组中。问题在于,不是迭代数组中的每个项并显示它,而是只显示数组中的最后一个项 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title></title>

我想打印一个段落,其中包含一个使用JavaScript setInterval方法每秒动态更改的术语

变化的术语在我想要迭代的数组中。问题在于,不是迭代数组中的每个项并显示它,而是只显示数组中的最后一个项

代码如下:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title></title>
        <style>
            #changingText{
                color: blue;
                font-size: 2.8em;
            }
        </style>
    </head>
    <body>
        <p>Hello! I am a <span id="changingText">person</span></p>

        <script>
            var changingText = document.getElementById('changingText');

            var things = ['Rap fan', 'runner', 'male', 'basketball player', 'mammal'];

            setInterval(changeText, 1000);

            function changeText() {
                for(var i = 0; i < things.length; i++) {
                    changingText.innerHTML = things[i];
                }

            }


        </script>
    </body>
</html>

#长文{
颜色:蓝色;
字号:2.8em;
}
你好!!我是一个人

var changingText=document.getElementById('changingText'); var things=[‘说唱迷’、‘跑步者’、‘男性’、‘篮球运动员’、‘哺乳动物’]; 设置间隔(changeText,1000); 函数changeText(){ for(var i=0;i

我做错了什么?

问题是每次调用间隔时,for循环都在数组的每个成员上循环。我们希望它只是增加
i
,显示结果,然后退出函数,直到再次调用间隔

这里有一个正在运行的现场演示:

var changingText=document.getElementById('changingText');
var things=[‘说唱迷’、‘跑步者’、‘男性’、‘篮球运动员’、‘哺乳动物’];
设置间隔(changeText,1000);
var i=0;
函数changeText(){
changingText.innerHTML=事物[i];
i++;
如果(i>=things.length)i=0;
}
#更改文本{
颜色:蓝色;
字号:2.8em;
}

你好!我是个人

更改文本功能每秒运行一次,for循环每次从零到长度运行,然后将最后一项设置为文本。您应该提取i变量,并在每次调用函数时递增1。检查是否超出范围,然后将其设为零。

这是一个缩短的工作代码

var changingText=document.getElementById('changingText'))
,things=[‘说唱迷’、‘跑步者’、‘男性’、‘篮球运动员’、‘哺乳动物’];
var i=0;
setInterval(函数(){
如果(things.length>i){
changingText.innerHTML=事物[i];
i++;
} 
}, 1000);

你好!我是在
changeText
回调中运行循环的人。每隔一秒钟,它就会被调用,并将文本更改为所有
内容
,其速度如此之快,以至于只能看到最后一项

正确的方法是跟踪“当前”元素,以便在每次调用回调时显示和更新它

您可以通过存储当前元素的数组索引并在每次调用时递增它来实现这一点。确保注意数组边界

var i = 0;
function changeText() {
  changingText.innerHTML = things[i];
  i = (i+1) % things.length;  // "wrap around" the index when array bound is reached
}
你可以一起把柜台扔掉:

function changeText() {
  changingText.innerHTML = things[0];  // always take currently first item
  things.push(things.shift());  // rotate items in array (put first to back)
}

每秒执行整个
changeText()
。所以每次你把所有的
东西一个接一个地写出来。你的问题得到回答了吗?如果是的话,你介意接受你用过的答案吗?这样别人就不会浪费时间了。感谢您的理解。我的问题已经得到了回答,我对第一个答案发表了评论,效果很好。@Adrian通常在堆栈溢出问题上,如果答案对您有效,最好单击答案左侧的灰色复选标记,将其正式标记为“已接受”。这将为您和回答用户提供信誉点,并告诉其他用户问题已得到充分回答。谢谢好啊谢谢你向我解释。我对这个网站和它的方式还是很陌生的。我很感激任何给我指点迷津的人。有一个问题,当索引超出数组长度时,尝试在这里解决这个问题。@AdamAzad已经在你前面了。编辑以使用边界检查。