javascript - 使用 JavaScript 更改单击时的页面背景以匹配单击的页面元素的颜色

标签 javascript

我正在关注这里的教程 https://projects.raspberrypi.org/en/projects/cd-beginner-javascript-sushi/8进行猜颜色游戏。最后一部分是在猜测正确颜色时更改页面背景的挑战。我已经设法更改背景,但它只返回页面上最后一个按钮的颜色,而不是正确的按钮。这是一个用于演示的代码笔:https://codepen.io/nicdaslick/pen/QWbogQQ

我明白发生了什么,但不知道如何解决。该代码位于 for 循环内,但挑战提示中的建议是更改 for 循环内的颜色。我如何获取正确的颜色或者我的想法是错误的?

html:

<body>
<h1>Guess the colour!</h1>
    <h2 id="colourValue"></h2>
    <div id="buttonWrapper">
        <button class="colourButton"></button>
        <button class="colourButton"></button>    
        <button class="colourButton"></button>    
        <button class="colourButton"></button>    
        <button class="colourButton"></button>    
        <button class="colourButton"></button>    
    </div>
    <h2 id="answer"></h2>

    <div id="reset"><button id="resetButton">Reset game</button></div>
</body>

CSS:

.colourButton{
    background-color: rgb(255,0,0);
    width: 50px;
    height: 50px;
    border: none;
    border-radius: 50%;
    box-shadow: none;
    margin: 10px;
}

#buttonWrapper{
    width: 100%;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-around;
    margin: 0 auto;
}

h1{
    text-align: center;
}

#colourValue{
    margin: 0 auto;
    text-align: center;
}

#answer{
    margin: 0 auto;
    text-align: center;
}

#reset{
    margin: 0 auto;
    text-align: center;
}

#reset-button{
    padding: 10px;
    background: none;
    border: 1px solid #000;
    margin: 10px;
}

js:

function makeColourValue(){
  return Math.round(Math.random()*255);
}

function setButtonColour(button, red, green, blue) {
  button.setAttribute(
    'style',
    'background-color: rgb('+ red +','+ green +','+ blue +');'
  );
}

var buttons = document.getElementsByClassName('colourButton');

var heading = document.getElementById('colourValue');

var answerMessage = document.getElementById('answer');

function startGame() {
  answerMessage.innerHTML = "";
  var answerButton = Math.round(Math.random() * (buttons.length - 1));

  for(var i = 0; i < buttons.length; i++) {
    var red = makeColourValue();
    var green = makeColourValue();
    var blue = makeColourValue();

    setButtonColour(buttons[i], red, green, blue);

    if (i === answerButton) {
      heading.innerHTML =`(${red}, ${green}, ${blue})`;
    }

    buttons[i].addEventListener('click', function(){
      if (this === buttons[answerButton]) {
        answerMessage.innerHTML = "Correct!";
        document.body.style.backgroundColor = 'rgb('+ red +','+ green+','+ blue+')';
      } else {
        answerMessage.innerHTML = "Wrong answer! Guess again!";
      }
    });
  }
}

startGame();

document.getElementById('resetButton').addEventListener('click', startGame);

最佳答案

一个问题是您使用了 var 而不是 letconst

当您使用 var 声明变量时,它会创建一个函数范围的变量,无论您在何处声明它。因此,在 for 循环内,redgreenblue 都在循环的每次迭代中引用相同的值,而不是您每次循环迭代都有不同的值。将这些变量视为在 startGame 函数顶部提升和声明。

将它们更改为 constlet 应该使变量 block 作用域,因此它们将存在于 的范围内>for 循环。这将允许也在循环内声明的事件监听器关闭每次迭代的唯一值。

我恳求您永远不要再使用var;除了允许您的代码在古老的浏览器中运行之外,与 letconst 提供的功能相比,它没有任何可取之处。

关于javascript - 使用 JavaScript 更改单击时的页面背景以匹配单击的页面元素的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60958480/

相关文章:

javascript - 正则表达式:获取捕获组的位置列表,而不是匹配项

javascript - 如何使用 jquery 永久添加元素,然后它会逐渐添加数字,例如 Cam 1、Cam 2、Cam 3 等。使用 iframe

javascript - 在 SailsJS 中验证请求参数

JavaScript - 替换嵌套对象的值,而不影响整个对象

javascript - 如何在 AngularJs 中更新不同页面上的元标记和标题?

javascript - 如何在没有textarea或textfield的浏览器中编辑网页内容?

javascript - 我如何读取android中的屏幕宽度和高度?

javascript - 使用 jquery 获取外部父 UL

javascript - 不同 Canvas 渲染

javascript - 从 Webpack DLL 构建中排除模块