记忆游戏元素创建代码失效,请求协助排查故障原因
记忆游戏JavaScript代码失效原因分析
先把你提供的代码贴出来方便对照:
const cardSet = ['fa fa-diamond','fa fa-diamond','fa fa fa-paper-plane- o','fa fa-paper-plane-o','fafa-anchor','fa fa-anchor','fa fa-bolt','fa fa- bolt','fa fa-cube','fa fa-cube','fa fa-leaf','fa fa-leaf','fa fa- bicycle','fa fa-bicycle','fa fa-bomb','fa fa-bomb']; let cardsOpen=[]; let cardsflipped = 0; const theDeck = document.querySelector('deck'); window.onload=function(){ shuffle(cardSet); for(let i; i<=cardSet.length;i++){ let cards= document.createElement('li'); cards.innerHTML='<i class="'+ cardSet[i] +'"></i>'; cards.classList.add('card'); theDeck.appendChild(cards);
咱们一步步拆解代码里的问题:
DOM选择器错误
你用document.querySelector('deck')是在找标签名为<deck>的元素,但实际项目里牌组容器一般是用类(比如<div class="deck">)或者ID(比如<div id="deck">)定义的,直接写deck根本找不到对应的DOM节点。后面往theDeck里添加卡牌时,会因为theDeck是null而抛出错误。应该改成.deck(类选择器)或者#deck(ID选择器),具体看你的HTML结构。卡牌类名拼写错误
看cardSet数组里的元素,好多都有拼写问题:'fa fa fa-paper-plane- o'多了空格和多余的fa'fafa-anchor'少了空格,应该是'fa fa-anchor''fa fa- bolt'多了空格,应该是'fa fa-bolt''fa fa- bicycle'多了空格,应该是'fa fa-bicycle'
这些错误的类名不仅会让Font Awesome图标显示不出来,还会导致相同卡牌的类名不一致——比如两个锚形卡牌一个是fafa-anchor一个是fa fa-anchor,游戏里永远匹配不上,直接破坏核心逻辑。
for循环初始化与边界错误
你的循环写的是for(let i; i<=cardSet.length;i++),这里有两个问题:i没有初始化,默认是undefined,undefined <= 16是false,循环根本不会执行,自然不会创建任何卡牌元素;- 就算初始化了
i,用i<=cardSet.length也会导致数组越界——数组索引从0开始,cardSet长度是16,最大索引是15,当i=16时访问cardSet[16]会得到undefined,创建出无效的卡牌。
正确的写法应该是:for(let i = 0; i < cardSet.length; i++)
shuffle函数未定义
代码里调用了shuffle(cardSet),但完全没有这个函数的实现!JS引擎找不到这个函数会直接抛出ReferenceError,代码直接中断执行。你需要补充一个洗牌函数,比如常用的Fisher-Yates洗牌算法:function shuffle(array) { let currentIndex = array.length, randomIndex; while (currentIndex !== 0) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]; } return array; }代码未闭合
你提供的代码最后缺少了多个闭合大括号:window.onload的函数体、for循环的代码块都没闭合,这会导致语法错误,JS引擎根本无法正确解析这段代码。
内容的提问来源于stack exchange,提问作者Abdo Choufani
相关产品推荐
相关产品推荐

