JavaScript 函数返回未定义。循环遍历单击事件的按钮节点列表

问题描述 投票:0回答:1

在尝试调整我的 console.log 剪刀石头布游戏以使用 GUI 时 - 我已经为用户输入设置了按钮,但我组合在一起的函数始终返回未定义(getPlayerSelection)。

具体来说,我试图返回单击的按钮的文本内容,以便我可以将其用作用户的输入。 console.log(input) 显示正确的字符串,但当我尝试返回该值时,它总是显示为未定义。

HTML

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Rock Paper Scissors!</title>
</head>
<body>

    <section id="choices">
    <button class="button">Rock!</button>
    <button class="button">Paper!</button>
    <button class="button">Scissors!</button>
    </section>

    <script src="javascript.js" defer></script>
</body>

JAVASCRIPT

    // player input

function getPlayerSelection(){

        const buttons = document.getElementsByClassName('button');

        let input = '';
            
        for (const btn of buttons) {
            btn.addEventListener('click', () => {
                input =  btn.textContent;
                console.log(input);
            })
        }

        return input;
    
    }


    // computer input

function getComputerChoice(){
        let randomChoice = Math.floor(Math.random() * 3);
            
        if(randomChoice === 0){
            return("Rock!")
        } else if(randomChoice === 1){
            return("Paper!")
        } else {
            return("Scissors!")
        }
    }


function playRound(playerSelection, computerSelection) {

    playerSelection = getPlayerSelection();
    computerSelection = getComputerChoice();

我尝试为每个按钮设置单独的类名并拥有自己的事件侦听器,但我认为我一定误解了 DOM 操作的工作原理。这也返回未定义。

    const rockBtn = document.querySelector('.rockButton');
    rockBtn.addEventListener('click', () => {
        return 'Rock!';
    });

    const paperBtn = document.querySelector('.paperButton');
    paperBtn.addEventListener('click', () => {
        return 'Paper!';
    });

    const scissorsBtn = document.querySelector('.scissorsButton');
    scissorsBtn.addEventListener('click', () => {
        return 'Scissors!';
    });

javascript function dom events undefined
1个回答
0
投票

您的代码的问题在于您的高阶函数 playGround 的结构不佳,并且您尝试在通过 DOM API 连接按钮之前返回按钮的文本内容。

没有记录错误,因为您使用空字符串初始化了输入变量,因此返回的只是空字符串。

长话短说,每当您调用 playGround 函数时,都会返回空的输入变量,您在链接代码中的按钮之前调用了该函数。

以下代码应该可以工作,您可以根据需要进行调整

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Rock Paper Scissors!</title>
    <script src="javascript.js" defer></script>
  </head>
  <body>
    <section id="choices">
      <button class="button">Rock!</button>
      <button class="button">Paper!</button>
      <button class="button">Scissors!</button>
    </section>
  </body>
</html>

JS

const buttons = document.getElementsByClassName("button");
for (const btn of buttons) {
  btn.addEventListener("click", () => {
    playRound(btn.textContent);
  });
}

function getPlayerSelection(input) {
  return input;
}

function getComputerChoice() {
  let randomChoice = Math.floor(Math.random() * 3);

  if (randomChoice === 0) {
    return "Rock!";
  } else if (randomChoice === 1) {
    return "Paper!";
  } else {
    return "Scissors!";
  }
}

function playRound(playerSelection) {
  playerSelection = getPlayerSelection(playerSelection);
  computerSelection = getComputerChoice();
  console.log(`Player: ${playerSelection}`, `Computer: ${computerSelection}`);
}
© www.soinside.com 2019 - 2024. All rights reserved.