开发记忆游戏时调用appendChild()报错:appendChild不是函数,求帮助
解决
appendChild is not a function错误及记忆游戏初始化代码修复 嘿,我来帮你搞定这个问题!咱们先从你遇到的核心错误说起,再把代码里的其他小问题一起修正,让你的记忆游戏能正常跑起来~
核心错误原因:theDeck不是单个DOM元素
你用document.getElementsByClassName('deck')获取的是一个HTMLCollection(类数组对象),它包含了所有带deck类的元素,而这个集合本身并没有appendChild方法。这就是报错的根源!
修复方式:
把获取deck元素的代码改成下面二选一:
- 使用
querySelector直接获取第一个匹配的元素:let theDeck = document.querySelector('.deck'); - 或者从HTMLCollection里取第一个元素:
let theDeck = document.getElementsByClassName('deck')[0];
代码里的其他问题及修复
除了上面的错误,你的初始化代码还有几个小问题需要调整:
- 循环中引用错误的变量:在创建卡片的
innerHTML里,你写的是cardSet,但应该引用循环的当前图标类名(也就是forEach的参数)。 - 只添加了最后一张卡片:你每次循环都覆盖
cards变量,最后只把最后创建的卡片添加到deck里,应该在循环内部就把每一张卡片追加到deck中。 - 洗牌函数的调用:确保你的
shuffle函数是正确的洗牌实现(比如Fisher-Yates算法),否则卡片不会被正确打乱。
修正后的完整代码
const cardSet = ['fa-diamond','fa-diamond','fa-paper-plane-o','fa-paper-plane-o','fa-anchor','fa-anchor','fa-bolt','fa-bolt','fa-cube','fa-cube','fa-leaf','fa-leaf','fa-bicycle','fa-bicycle','fa-bomb','fa-bomb']; let cardsOpen = []; let cardsflipped = 0; // 改用querySelector获取单个deck元素 let theDeck = document.querySelector('.deck'); // 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 = function startGame(){ shuffle(cardSet); // 遍历打乱后的卡片集合,创建每一张卡片并添加到deck cardSet.forEach(function(iconClass){ const card = document.createElement('li'); card.classList.add('card'); // 这里用当前循环的iconClass,而不是整个cardSet数组 card.innerHTML = `<i class="fa ${iconClass}"></i>`; theDeck.appendChild(card); }); };
这样修改后,你的初始化函数就能正常创建并添加所有卡片到deck里,不会再出现appendChild is not a function的错误啦~
内容的提问来源于stack exchange,提问作者Abdo Choufani
相关产品推荐
相关产品推荐

