这是指向我的代码的链接:https://jsfiddle.net/springleader/vt56fy85/12/
我正在为学校制作Simon启发的内存游戏,但是当我按开始按钮时,我的凌乱,长的JavaScript代码会冻结。我不是网络编程专家,我仍在自学。
这是启动的地方(单击开始按钮时)
document.getElementById("uibtn").onclick = function(){
var uibtn = e('uibtn');
uibtn.remove("uibtn");
removeHeader();
}
它删除了启动按钮并跳到" removeheader"功能。
function removeHeader(){
var rndhdr = e('rndhdr');
var rndv1 = rndhdr.childNodes;
while(rndv1.length >= 1){
rndv1[0].remove();
}
createHeader();
}
此部分不完整,并检查现有的圆形计数器(例如"回合1")并删除它。然后调用CreateHeader()。
function createHeader(){
var rndhdr = e('rndhdr');
var hdr = document.createElement('h');
hdr.setAttribute('id', 'hdr');
hdr.setAttribute('class', 'hc');
hdr.innerHTML = "<h>Round 1</h>";
rndhdr.appendChild(hdr);
Game();
}
此功能放置了一个新的圆头标头"第1轮"。这将根据用户完成的回合而改变,但尚未添加该部分。
function Game(){
var corct = true;
while(corct == true){
var newcol = Math.floor((Math.random() * 4) + 1);
sofar = newcol.toString() + sofar;
Flashing(sofar);
}
}
该部分生成一个数字1到4,该数字对应于按钮(分别为绿色,红色,蓝色和黄色),并将其添加到包含所有生成数字的数组中。然后它跳到flashing()函数。
function Flashing(){
thr = sofar.length;
while(sofar[thr] > -1){
var btn = sel(sofar[thr]);
btn.style.borderColor = "white";
blinking = true;
setTimeout(function(){Flash(btn);}, 2000);
thr--;
}
Game();
}
function Flash(el){
el.style.borderColor = el.style.backgroundColor;
blinking = false;
}
此功能获取SOFAR []数组中的字符串数,然后调用flash(),将flash()闪烁列表中的按钮2秒。
我在重新阅读它的同时尝试了一些调整代码,现在超出了我的呼叫堆栈大小。我不知所措,为什么这会破裂...
这个答案是在编辑问题之前编写的。我相信它仍然可以解决此问题的关键。
当我将您的代码重建到独立页面并运行它时,Firefox警告我有关无反应的脚本。杀死它显示了它在控制台中终止的线路。在那里看,我看到
while(running == true){
那个循环中没有任何将running
设置为false的循环(或者确实是脚本中的任何地方)。另外,
while(blinking = true){}
是保证的无限循环。在上面,您在
中还有另一个无限循环while(corct == true){
只要JavaScript引擎正在运行您的代码,浏览器就会无反应。无限循环不要在网络浏览器中飞行。