当我按下 submit/play 时,表单上的事件侦听器不会触发

Event listener on form doesn't fire when I press submit/play

我想让表单提交 playerOne 和 playerTwo 的名称,但我似乎无法弄清楚,当我在表单上监听提交事件时,它并没有触发它。在下面的片段中是我所有的代码。

form.addEventListener('submit', (event) => {
      event.preventDefault();
      console.log("Doesnt work")
    })

// player factory...
const playerFactory = (name, mark) => {
  const playTurn = (event, currentPlayer) => {
    const id = boardObject.cells.indexOf(event.target);
    boardObject.boardArray[id] = currentPlayer;
    boardObject.render();
  };

  return {
    playTurn, name, mark
  };
};

// Gameboard object...
const boardObject = (() => {
  let boardArray = ["", "", "", "", "", "", "", "", ""];

  const cells = Array.from(document.querySelectorAll(".cell"));
  // displays the content of the boardArray...
  const render = () => {
    boardArray.forEach((mark, idx) => {
      cells[idx].textContent = boardArray[idx];
    });
  };

  const checkWin = (currentPlayer) => {
    const winArraysCombinations = [
      [0, 1, 2],
      [3, 4, 5],
      [6, 7, 8],
      [0, 3, 6],
      [1, 4, 7],
      [2, 5, 8],
      [0, 4, 8],
      [2, 4, 6],
    ];

    return winArraysCombinations.some((combination) => {
      return combination.every((index) => {
        return boardArray[index].includes(currentPlayer);
      });
    });
  };

  const isDraw = (playerOne, playerTwo) => {
    return boardArray.every((cell) => {
      return cell.includes(playerOne) || cell.includes(playerTwo);
    });
  };

  return {
    boardArray,
    render,
    cells,
    checkWin,
    isDraw,
  };
})();

// Display controller ...
const displayController = (() => {
  const player = playerFactory();
  const playerOneName = document.querySelector('#playerx');
  const playerTwoName = document.querySelector('#playero');
  const resetButton = document.querySelector('.reset_button');
  const formdiv = document.querySelector('.input_form');
  
  const gameBoard = document.querySelector(".game_board");
  const form = document.querySelector('.player_info');
  let playerOne;
  let playerTwo ;
  let currentPlayer;
  

  const switchPlayer = () => {
    currentPlayer = currentPlayer === playerOne ? playerTwo : playerOne;
  };

  gameBoard.addEventListener("click", (event) => {
    event.preventDefault();
    if (event.target.classList.contains("cell")) {
      if (event.target.textContent === "") {
        event.target.textContent = currentPlayer;
        player.playTurn(event, currentPlayer);
        if (boardObject.checkWin(currentPlayer)) {
          console.log(currentPlayer + " is winner!");
        } else if (boardObject.isDraw(playerOne, playerTwo)) {
          console.log("draw");
        } else {
          switchPlayer();
        }
      }
    }

    const init = () => {
      if (playerOneName.value !== '' && playerTwoName !== '' ) {
        playerOne = playerFactory(playerOneName.value, 'X');
        playerTwo = playerFactory(playerTwoName.value, 'O');
        currentPlayer = playerOne;
      };
    }

    form.addEventListener('submit', (event) => {
      event.preventDefault();
      console.log("Doesnt work")
    })
    
    
      // if (playerOneName.value !== '' && playerTwoName.value !== '') {
      //   init();
      //   console.log(playerOne)
      // } else {
      //   window.location.reload();
      // }
    

    

    return { currentPlayer, playerOne, playerTwo, init };
  });
})();
*, *::before, *::after {
    box-sizing: border-box;
    margin:0;
    padding:0;
}

body {
    font-family: 'Roboto', sans-serif;
    background: #BEE9E8;
}

header {
    background: #1B4965;
    text-align: center;
    color: #62B6CB;
    padding-top: 20px;
    padding-bottom: 10px;
}



.game_board {
    display: grid;
    width: 500px;
    height: 500px;
    grid-template-rows: repeat(3, 1fr);
    grid-template-columns: repeat(3, 1fr);
    margin: 0 auto;
    margin-top: 40px;
    border: 5px solid #1B4965;
    border-radius: 10px;
    
}

.hidden {
    display: none;
}

.cell {
    border: 5px solid #1B4965;
    display: flex;
    justify-content: center;
    align-items: center;
    background: #62b6cb;
    color:#1b4965;
    font-size:4em;
    font-weight: bold;
}

.player_info {
    color:#1B4965;
    font-size: 2em;
}

.input_form {
    display: flex;
    margin-top: 50px;
    justify-content: center;
    text-align: center;
    
}

.player_group {
    margin-top:20px;
}

input { 
    padding: 15px;
    border-radius: 5px;
    background: #1A4965;
    color: #62B6CB;
    
}

input::placeholder {
    color: #62b6cb;
}

#reset {
    padding: 10px;
    background: #1A4965;
    color: #62b6cb;
}

.reset_button {
    text-align: center;
    margin-top: 30px;
    padding: 10px;
}

.submitButton {
    margin-top: 15px;
    padding:5px;
    width: 100px;
    color:#62b6cb;
    background: #1A4965;
    border-radius: 5px;
    font-weight: bold;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tic Tac Toe</title>
    <link rel="stylesheet" href="./style.css">
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@500&display=swap" rel="stylesheet">
</head>
<body>
    <header>
        <h1>Tic - Tac - Toe<br>The Odin Project</h1>
    </header>

    <div class="input_form">
        <form class="player_info">
            <div class="player_group">
                <label for="playerx">Player X:</label>
                <input type="text" id="playerx" name="playerx" placeholder="Name of player X">
            </div>

            <div class="player_group">
                <label for="playero">Player O:</label>
                <input type="text" id="playero" name="playero" placeholder="Name of player O">
            </div>
            <div><input type="submit" class="submitButton"  value="Play !"></div>
        </form>
    </div> 
        

        
        <div class="game_board hidden">
            <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell"></div>
        </div>
        <div class="reset_button hidden">
            <button id="reset">Restart the game!</button>
        </div>
        
    



    <script src="./index.js" defer></script>
</body>
</html>

问题是 事件侦听器被添加的位置 - 现在,您在 gameBoard click 事件中有它。由于该事件仅在 gameBoard 被点击后运行,并且 gameBoard 尚不可见,因此无法触发点击事件,并且永远不会将侦听器添加到表单中。

如果你只是想从一开始就附加它(你可能会这样做) - 只需将 form.addEventListener() 块移到 gameBoard.addEventlistener() 块之外,比如在结束后 "});"在 javascript 文件的 second-to-last 代码行中。