Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.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随机化数组元素并按时间间隔选择一个_Javascript_Arrays_Random - Fatal编程技术网

使用javascript随机化数组元素并按时间间隔选择一个

使用javascript随机化数组元素并按时间间隔选择一个,javascript,arrays,random,Javascript,Arrays,Random,我编写了一段代码,可以从数组中随机选取一个元素,并在某个时间间隔内连续循环脚本。当我运行它时,它可以工作,但浏览器冻结,所以它的代码很糟糕。它基于Fisher-Yates算法。代码如下: 函数随机注释(x){ var frame=document.getElementById(“frame”); var my#u数组=['E','G','A','C','D','G','F','C','D','A','F','B']; var ri=Math.floor(Math.random()*my_arr

我编写了一段代码,可以从数组中随机选取一个元素,并在某个时间间隔内连续循环脚本。当我运行它时,它可以工作,但浏览器冻结,所以它的代码很糟糕。它基于Fisher-Yates算法。代码如下:

函数随机注释(x){
var frame=document.getElementById(“frame”);
var my#u数组=['E','G','A','C','D','G','F','C','D','A','F','B'];
var ri=Math.floor(Math.random()*my_array.length);
var result=my_数组[ri];
var div=document.getElementById('frame');
div.innerHTML=结果;
setTimeout(“random_notes()”,x*1000);//x表示秒
返回随机_注释();
}
}

调用它时,x表示延迟,refreshId表示变量,这样就可以从外部停止循环。乙二醇

var tmp;
random_notes(10, tmp);
if (something) clearInterval(tmp);
编辑:将DOM getElementById移到setInterval之外以加快速度
addEventListener(“DOMContentLoaded”),函数(事件){
var span_randomElement=document.getElementById(“span_randomElement”);
var button_getRandomElement=document.getElementById(“button_getRandomElement”);
var元素='E G A C D G#F C#D#A#E#B'。拆分('';
var乘数=1;
var秒=1000*乘数;
var随机数=0;
var lastRandomNumber=0;
函数start_gettingRandomNumber(){
setInterval(函数(){
做{
randomNumber=Math.floor((Math.random()*(elements.length-1))+0);
}while(randomNumber==lastRandomNumber);
lastRandomNumber=随机数;
span_randomElement.innerHTML=元素[randomNumber];
},秒);
}  
按钮\u getRandomElement.addEventListener(“单击”,函数(){
start_gettingRandomNumber();
警报(“每“+倍增+”秒获取随机字母…”);
});
});

获取一个随机元素

您的函数有一个无限循环-最后,它尝试返回自己的返回值,永远递归。不管超时如何。将字符串传递给
setTimeout
不是一个好主意,请参阅@doldt good point,因此
setTimeout
将使用
undefined*1000
=
NaN
调用,因为超时意味着
random_notes()
立即再次被调用。这导致了一些非常指数的递归。难怪浏览器冻结了。是的,我知道它有无限循环,以及为什么浏览器冻结的原因……有人能帮我修复它吗?@MilosM不会从函数返回任何东西(因为它已经修改了dom),也不要在setTimeout中使用字符串-在那里创建一个匿名函数,调用random_notes(x)再一次。欢迎来到堆栈溢出!以下几点提示:1)当你更新答案时,通常不需要写“编辑”说明——这很常见,建议你自由更新。2)
clearInterval(tmp)
不起作用-
tmp
此时是
未定义的
-在函数中分配
refreshId
不会改变
tmp
的值。我承认我没有测试上述代码,但我很快就会测试。参数是通过ref传递的,所以我想它会起作用。BRBJavaScript参数确实是通过引用传递的,但在与C++相同的单词意义上没有。在函数内部写入
refreshId=…
时,它不会返回函数外部并更改传递到函数中的变量的值。它用一个新值替换本地
refreshId
变量,并且只替换该本地变量。您可以做的是从函数返回间隔ID。我明白了。谢谢你的评论。顺便说一句,下面的场景可以工作(我想是的):tmp={},在函数之外。refreshId.id=setInterval(…)。外部tmp可以看到(?)对对象所做的更改。只是一个提示,如果您想要一个更干净的方法来设置
元素
数组,您可以这样做:
var元素='egacddg#fcd#a#E#B'。split-这对于此类数组非常方便。另一个提示。。。我绝对不建议这样做:
var elementsLength=elements.length-这只会增加出错的可能性。只需在需要的地方直接使用
元素。长度
。这项工作做得很好。现在我将尝试编写函数来传入参数以更改乘数值。谢谢你,伙计,你解决了我的问题!不客气,别忘了写下最符合你需要的答案,以警告其他堆垛者你的问题已经解决。嗨,伙计们,我最近设法上传了我的网站,在这个链接上有一个工具,在你的帮助下是不可能存在的!:)再次感谢!
var tmp;
random_notes(10, tmp);
if (something) clearInterval(tmp);