javascript - 我收到“未捕获的 TypeError:无法读取属性 'addEventListener' of null”,不太清楚为什么
问题描述
所以我正在使用 html/css 和 javascript 制作一个基本的井字游戏应用程序,但是,我不断收到此错误“script.js:13 Uncaught TypeError: Cannot read property 'addEventListener' of null at playBtn (script.js:13 ) 在 HTMLDocument. (script.js:8)"。我搜索的所有地方都说这是因为我的 javascript 是在我的 DOM 之前加载的,所以我将我的 javascript 包装在 document.addEventListener("DOMContentLoaded", function (event) {} function 但我仍然收到此错误。帮助会很多赞赏。在下面添加了 html 和 js 代码。ps. html/css/js 仍然是新的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<script type="module" src="https://unpkg.com/ionicons@5.0.0/dist/ionicons/ionicons.esm.js"></script>
<script nomodule="" src="https://unpkg.com/ionicons@5.0.0/dist/ionicons/ionicons.js"></script>
<link rel="stylesheet" href="resources/css/style.css">
<title>Tic Tac Toe</title>
</head>
<body>
<!--row 1 -->
<h1>Tic Tac Toe</h1>
<div class="container">
<div class="player1-text">
<h2>Player 1</h2>
</div>
<div class="game-container">
<div class="tile-1">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
<div class="tile-2">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
<div class="tile-3">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
<!--row 2 -->
<div class="tile-4">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
<div class="tile-5">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
<div class="tile-6">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
<!--row 3 -->
<div class="tile-7">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
<div class="tile-8">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
<div class="tile-9">
<ion-icon name="close-outline"></ion-icon>
<ion-icon name="ellipse-outline"></ion-icon>
</div>
</div>
<div class="player2-text">
<h2>Player 2</h2>
</div>
</div>
<div>
<button class="play-btn">
Play game
</button>
</div>
<script src="resources/js/script.js"></script>
</body></html>
document.addEventListener("DOMContentLoaded", function (event) {
var activePlayer, gamePlaying;
var p1Checks, p2Checks;
var playButton = document.querySelector('play-btn');
init();
playBtn();
function playBtn() {
playButton.addEventListener('click', function () {
gamePlaying = true;
activePlayer = 1;
for (var i = 1; i < 10; i++) {
clickTiles(i);
}
});
}
function clickTiles(i) {
document.querySelector('.tile-' + i).addEventListener('click', function () {
if (activePlayer === 1) {
document.querySelector('.tile-' + i).classList.add('p1-t' + i);
p1Checks[i - 1] = 1;
checkP1Win();
} else {
document.querySelector('.tile-' + i).classList.add('p2-t' + i);
p2Checks[i - 1] = 1;
checkP2Win();
}
document.querySelector('.tile-' + i).classList.add('clicked');
nextPlayer();
});
}
function nextPlayer() {
if (activePlayer === 1) {
activePlayer = 2;
} else {
activePlayer = 1;
}
for (var i = 1; i < 10; i++) {
if (activePlayer === 2) {
document.querySelector('.tile-' + i).classList.remove('player-1');
document.querySelector('.tile-' + i).classList.add('player-2');
} else {
document.querySelector('.tile-' + i).classList.remove('player-2');
document.querySelector('.tile-' + i).classList.add('player-1');
}
}
}
function init() {
//initialise evrything here
gamePlaying = false;
p1Checks = [0, 0, 0, 0, 0, 0, 0, 0, 0];
p2Checks = [0, 0, 0, 0, 0, 0, 0, 0, 0];
for (var i = 1; i < 10; i++) {
document.querySelector('.tile-' + i).classList.remove('player-1');
document.querySelector('.tile-' + i).classList.remove('player-2');
document.querySelector('.tile-' + i).classList.remove('p1-t' + i);
document.querySelector('.tile-' + i).classList.remove('p2-t' + i);
}
}
function checkP1Win() {
//all possible win conditions
if (p1Checks[0] == 1 && p1Checks[1] == 1 && p1Checks[2] == 1) {
alert("Player 1 wins!");
} else if (p1Checks[0] === 1 && p1Checks[3] === 1 && p1Checks[6] === 1) {
alert("Player 1 wins!");
} else if (p1Checks[0] === 1 && p1Checks[4] === 1 && p1Checks[8] === 1) {
alert("Player 1 wins!");
} else if (p1Checks[1] === 1 && p1Checks[4] === 1 && p1Checks[7] === 1) {
alert("Player 1 wins!");
} else if (p1Checks[2] === 1 && p1Checks[4] === 1 && p1Checks[6] === 1) {
alert("Player 1 wins!");
} else if (p1Checks[2] === 1 && p1Checks[5] === 1 && p1Checks[8] === 1) {
alert("Player 1 wins!");
} else if (p1Checks[3] === 1 && p1Checks[4] === 1 && p1Checks[5] === 1) {
alert("Player 1 wins!");
} else if (p1Checks[6] === 1 && p1Checks[7] === 1 && p1Checks[8] === 1) {
alert("Player 1 wins!");
}
}
function checkP2Win() {
//all possible win conditions
if (p2Checks[0] == 1 && p2Checks[1] == 1 && p2Checks[2] == 1) {
alert("Player 2 wins!");
} else if (p2Checks[0] === 1 && p2Checks[3] === 1 && p2Checks[6] === 1) {
alert("Player 2 wins!");
} else if (p2Checks[0] === 1 && p2Checks[4] === 1 && p2Checks[8] === 1) {
alert("Player 2 wins!");
} else if (p2Checks[1] === 1 && p2Checks[4] === 1 && p2Checks[7] === 1) {
alert("Player 2 wins!");
} else if (p2Checks[2] === 1 && p2Checks[4] === 1 && p2Checks[6] === 1) {
alert("Player 2 wins!");
} else if (p2Checks[2] === 1 && p2Checks[5] === 1 && p2Checks[8] === 1) {
alert("Player 2 wins!");
} else if (p2Checks[3] === 1 && p2Checks[4] === 1 && p2Checks[5] === 1) {
alert("Player 2 wins!");
} else if (p2Checks[6] === 1 && p2Checks[7] === 1 && p2Checks[8] === 1) {
alert("Player 2 wins!");
}
}
function playerWins() {
//add code here to make all the tiles unclickable and then display who won
}
function playAgainBtn() {
//button to initialise evrything when pressed
}
});
解决方案
推荐阅读
- django - 如何通过 drf-yasg 为 ReDoc 添加 x-server 和 x-taggroups
- java - 如何更新用maven制作的java桌面应用程序jar
- video - 从 FFmpeg 得到的帧数和它的分裂动作结果不一样?
- ios - iOS 使用 swift 创建通用 Alamofire 请求
- ios - 我可以使用 whileElement(...).atIndex(..) 来区分多个滚动页面 id
- google-apps-script - 有没有办法限制/限制 Google 表格列中一次执行的单元格数量
- r - 根据 R 中的日期范围计算平均值
- javascript - 无法将项目添加到数组
- elixir - 通过图形 api 创建 Outlook 日历事件时创建团队链接
- javascript - 在小屏幕上显示行中的 div