【问题标题】:Add Javascript counters to colour counter将 Javascript 计数器添加到颜色计数器
【发布时间】:2022-02-11 22:48:39
【问题描述】:

我正在制作一个颜色计数器应用程序,它有 6 种不同的颜色。

我目前正在尝试实现一个纯 JavaScript 计数器,它对每种颜色都有一个单独的计数器。

(更正:不是计算页面上显示的不同颜色,而是当用户在周围环境中看到与6种颜色中的一种颜色匹配的颜色时,将计数器加1,例如用户看到天空是蓝色的草是绿色的,用户将鼠标悬停在蓝色上,出现增加和减少按钮,用户将蓝色增加 1 个增量,然后对于草,用户将鼠标悬停在绿色上,再次按钮出现,用户将绿色计数器增加 1。)

当用户将鼠标悬停在颜色按钮上时,颜色按钮必须显示为将计数器增加或减少 1,最小为 0。

每种颜色的计数必须始终显示在颜色上方。

我当前的方法似乎相当长,我确信有一种方法可以设置某种方法来处理所有颜色,但又为每种颜色设置单独的计数器。

请参阅下图了解我想要实现的目标: See this image

任何帮助将不胜感激, 我在下面包含了我当前的代码以供参考

var green = 0;
var countEl1 = document.getElementById("green");
function plus1(){
    green++;
    countEl1.value = green;
}
function minus1(){
    if (green > 0) {
        green--;
        countEl1.value = green;
    }
}
var brown = 0;
var countEl2 = document.getElementById("brown");
function plus2(){
    brown++;
    countEl2.value = brown;
}
function minus2(){
    if (brown > 0) {
        brown--;
        countEl2.value = brown;
    }
}
var blue = 0;
var countEl3 = document.getElementById("blue");
function plus3(){
    blue++;
    countEl3.value = blue;
}
function minus3(){
    if (blue > 0) {
        blue--;
        countEl3.value = blue;
    }
}
var yellow = 0;
var countEl4 = document.getElementById("yellow");
function plus4(){
    yellow++;
    countEl4.value = yellow;
}
function minus4(){
    if (yellow > 0) {
        yellow--;
        countEl4.value = yellow;
    }
}
var gold = 0;
var countEl5 = document.getElementById("gold");
function plus5(){
    gold++;
    countEl5.value = gold;
}
function minus5(){
    if (gold > 0) {
        gold--;
        countEl5.value = gold;
    }
}
var red = 0;
var countEl6 = document.getElementById("red");
function plus6(){
    red++;
    countEl6.value = red;
}
function minus6(){
    if (red > 0) {
        red--;
        countEl6.value = red;
    }
}
.pyramid {
    clip-path: polygon(50% 0, 100% 100%, 0 100%);
    width: 100vmin;
    aspect-ratio: 9 / 15; /* 2/1 */
    background-color: white;
    display: grid;
    grid-template-columns: 1fr;

}
.pyramid > * {
    background: white;
}
.one {
    background-color: rgba(234, 27, 7, 0.97);
}
.two {
    background-color: rgba(244, 182, 0, 0.98);
    margin-top: 10px;
}
.three {
    background-color: rgba(249, 224, 41, 0.98);
    margin-top: 10px;
}
.four {
    background-color: rgba(4, 157, 252, 0.98);
}
.five {
    background-color: rgba(167, 118, 67, 0.99);
    gap: 0% !important;
}
.six {
    background-color: rgba(92, 213, 51, 0.98);
}
.counter input[type=button], input[type=text] {
    display: inline-block;
    width: 20px;
    background-color: transparent;
    outline: none;
    border: none;
    text-align: center;
    cursor: pointer;
    padding: 0px;
    color: black;
    height: 33px;
    font-family: 'Open Sans';
}
#container {
    width: 100px;
    height: 100px;
    position: relative;
}
#navi,
#infoi {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
}
#infoi {
    z-index: 10;
}
button {
    border-radius: 50%;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Colour counter</title>
    <link rel="stylesheet" href="css/style.css">
    <script src="js/Main.js"></script>
</head>
<body>
<div id="container">
<h1>Colour counter</h1>
<div class="pyramid">
    <div class="one"></div>
    <div class="two"></div>
    <div class="three"></div>
    <div class="four"></div>
    <div class="five"></div>
    <div class="six"></div>
</div>

<h1>Counter Test</h1>
<div id="input_div">
    <input type="button" value="-" id="minus1" onclick="minus1()">
    <input type="text" size="25" value="0" id="green">
    <input type="button" value="+" id="plus1" onclick="plus1()">
    <script src="js/Main.js"></script>
</div>
<div id="input_div2">
    <input type="button" value="-" id="minus2" onclick="minus2()">
    <input type="text" size="25" value="0" id="brown">
    <input type="button" value="+" id="plus2" onclick="plus2()">
    <script src="js/Main.js"></script>
</div>




</div>
</body>
</html>

【问题讨论】:

  • 嗨 Lucas,你有很多冗余代码。为什么不使用贴图最初为每种颜色分配 0。并使用两个功能第一个增加任何和另一个减少任何。并在调用相应函数时传递颜色名称,以便您知道增加或减少哪个。

标签: javascript html css


【解决方案1】:

使用一个数组来对 DOM 进行操作并应用 map 来完成每个 colour 的工作,即以编程方式将事件侦听器附加到 DOM 元素。另外,在运行 JS 代码之前确保 DOM 已经完全加载:

window.onload = function() {

  let colours = ["green", "brown", "blue", "yellow", "gold", "red"]
    .map(id => {
      let colour = {
        elementCount: document.getElementById(id),
        elementPlus: document.getElementById(`${id}_plus`),
        elementMinus: document.getElementById(`${id}_minus`),
        counter: 0,
      };
    
      colour.elementPlus.addEventListener("click", function() {
        colour.counter++;
        colour.elementCount.value = colour.counter;
      });
    
      colour.elementMinus.addEventListener("click", function() {
        if (colour.counter > 0) {
          colour.counter--;
          colour.elementCount.value = colour.counter;
        }
      });
    
      return colour;
    });

};

调整 HTML,使 ID 与 JS 中使用的 ID 匹配:

  • 请使用green_minus,而不是minus1。对其余的 minus 按钮执行相同操作。
  • 请使用green_minus,而不是plus1。对其余的 plus 按钮执行相同操作。

修改 HTML 删除 onClick 属性(现在使用 JS 以编程方式分配)。

另外,现在您有了 colours 变量,所有 DOM 元素和每个颜色计数器都存储在其中,以供进一步检查和/或修改。

例如,HTML 中的一种颜色如下:

<div id="input_div">
    <input type="button" value="-" id="green_minus">
    <input type="text" size="25" value="0" id="green">
    <input type="button" value="+" id="green_plus">
</div>
<!-- Other colours... -->
<script src="js/Main.js"></script>

window.onload = function() {

  let colours = ["green", "brown", "blue", "yellow", "gold", "red"]
    .map(id => {
      let colour = {
        elementCount: document.getElementById(id),
        elementPlus: document.getElementById(`${id}_plus`),
        elementMinus: document.getElementById(`${id}_minus`),
        counter: 0,
      };
    
      colour.elementPlus.addEventListener("click", function() {
        colour.counter++;
        colour.elementCount.value = colour.counter;
      });
    
      colour.elementMinus.addEventListener("click", function() {
        if (colour.counter > 0) {
          colour.counter--;
          colour.elementCount.value = colour.counter;
        }
      });
    
      return colour;
    });
};
.pyramid {
    clip-path: polygon(50% 0, 100% 100%, 0 100%);
    width: 100vmin;
    aspect-ratio: 9 / 15; /* 2/1 */
    background-color: white;
    display: grid;
    grid-template-columns: 1fr;

}
.pyramid > * {
    background: white;
}
.one {
    background-color: rgba(234, 27, 7, 0.97);
}
.two {
    background-color: rgba(244, 182, 0, 0.98);
    margin-top: 10px;
}
.three {
    background-color: rgba(249, 224, 41, 0.98);
    margin-top: 10px;
}
.four {
    background-color: rgba(4, 157, 252, 0.98);
}
.five {
    background-color: rgba(167, 118, 67, 0.99);
    gap: 0% !important;
}
.six {
    background-color: rgba(92, 213, 51, 0.98);
}
.counter input[type=button], input[type=text] {
    display: inline-block;
    width: 20px;
    background-color: transparent;
    outline: none;
    border: none;
    text-align: center;
    cursor: pointer;
    padding: 0px;
    color: black;
    height: 33px;
    font-family: 'Open Sans';
}
#container {
    width: 100px;
    height: 100px;
    position: relative;
}
#navi,
#infoi {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
}
#infoi {
    z-index: 10;
}
button {
    border-radius: 50%;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Colour counter</title>
    <link rel="stylesheet" href="css/style.css">
    <script src="js/Main.js"></script>
</head>
<body>
<div id="container">
<h1>Colour counter</h1>
<div class="pyramid">
    <div class="one"></div>
    <div class="two"></div>
    <div class="three"></div>
    <div class="four"></div>
    <div class="five"></div>
    <div class="six"></div>
</div>

<h1>Counter Test</h1>
<div id="input_div">
    <input type="button" value="-" id="green_minus">
    <input type="text" size="25" value="0" id="green">
    <input type="button" value="+" id="green_plus">
</div>
<div id="input_div2">
    <input type="button" value="-" id="brown_minus">
    <input type="text" size="25" value="0" id="brown">
    <input type="button" value="+" id="brown_plus">
</div>
<div id="input_div3">
    <input type="button" value="-" id="blue_minus">
    <input type="text" size="25" value="0" id="blue">
    <input type="button" value="+" id="blue_plus">
</div>
<div id="input_div4">
    <input type="button" value="-" id="yellow_minus">
    <input type="text" size="25" value="0" id="yellow">
    <input type="button" value="+" id="yellow_plus">
</div>
<div id="input_div5">
    <input type="button" value="-" id="gold_minus">
    <input type="text" size="25" value="0" id="gold">
    <input type="button" value="+" id="gold_plus">
</div>
<div id="input_div6">
    <input type="button" value="-" id="red_minus">
    <input type="text" size="25" value="0" id="red">
    <input type="button" value="+" id="red_plus">
</div>



</div>
</body>
</html>

【讨论】:

  • 您甚至可以通过编程方式生成 DOM 元素,因此您的 HTML 也不会出现重复代码。
  • 感谢 @emi 的帮助,您的 js 文件第 20 行似乎有一个小错误,另外我将如何以编程方式生成它们。非常感谢:)
  • 错误现在在返回颜色下的第 25 行;
  • 我将如何以编程方式生成它们:有很多解决方案,从使用 document.createElement 的原始 Javascript 到 JQuery、React、Vue 等高级框架。这取决于你想进入兔子洞多长时间。
  • 错误现在出现在第 25 行的返回颜色下 已修复。我有一个额外的](并且没有测试代码;))
【解决方案2】:

我制作了一个变体,使用输入添加动态颜色,因此您可以调用任何您想要的颜色名称。

将按钮放在每种颜色上方有点困难,因为您使用的是多边形,所以在本例中按钮位于左侧

    <!DOCTYPE html>
    <html lang="en">

    <head>
      <meta charset="UTF-8">
      <title>Colour counter</title>
      <link rel="stylesheet" href="css/style.css">
      <script src="js/Main.js"></script>

      <style>
        .grid {
          display: flex;
          text-align: center;
          max-width: 480px;
        }

        .grid .counter {
          margin-right: 15px;
        }

        .counter .column {
          text-align: center;
          vertical-align: middle;
        }

        .column {
          height: 100px;
          width: 100px;
          display: flex;
          align-content: center;
          justify-content: center;
          align-items: center;
        }

        .form {
          margin: 10px 0;
        }

        .form input[type='text'] {
          margin: 3px 0;
          border: 1px solid black;
          width: 200px;
        }

        input[type='button'] {
          border: 1px solid black;
          margin: 0 4px;
        }

        .pyramid {
          clip-path: polygon(50% 0, 100% 100%, 0 100%);
          width: 300px;
          aspect-ratio: 9 / 15;
          /* 2/1 */
          background-color: white;
          display: grid;
          grid-template-columns: 1fr;

        }

        .pyramid>* {
          background: white;
        }

        .counter input[type=button],
        input[type=text] {
          display: inline-block;
          width: 20px;
          background-color: transparent;
          outline: none;
          border: none;
          text-align: center;
          cursor: pointer;
          padding: 0px;
          color: black;
          height: 33px;
          font-family: 'Open Sans';
        }

        #container {
          width: 100px;
          height: 100px;
          position: relative;
        }

        button {
          border-radius: 50%;
        }
      </style>



    </head>

    <body>
      <div class="color-counter">
        <h1>Colour counter</h1>
      </div>

      <div class="form">
        <form>
          <label for="fcolour">Enter the colour name: </label>
          <br>
          <input id="fcolour" type="text" name="fcolour">
          <br>
          <input type="button" value="Submit">
        </form>
      </div>

      <div id="container">

        <div class="grid">
          <div class="counter">
          </div>
          <div class="pyramid">
          </div>
        </div>

      </div>

      <script>

        document.querySelector('form input[type="button"]').addEventListener('click', function (e) {
          var colCounter = document.querySelector('.grid .counter')
          var colPyramid = document.querySelector('.grid .pyramid')
          var colorName = document.getElementById('fcolour').value

          var newCounterChild = document.createElement('div')
          newCounterChild.classList.add('column')
          newCounterChild.innerHTML = `
            <input type="button" value="-" id="minus_${colorName}">
            <input type="text" size="25" value="0" id=counter_${colorName}>
            <input type="button" value="+" id="plus_${colorName}">
          `

          colCounter.appendChild(newCounterChild)

          var newPyramidChild = document.createElement('div')
          newPyramidChild.classList.add('column')
          newPyramidChild.style.backgroundColor = colorName
          newPyramidChild.style.marginTop = '10px'

          colPyramid.appendChild(newPyramidChild)

          document.getElementById(`plus_${colorName}`).addEventListener('click', function (v) {
            document.getElementById(`counter_${colorName}`).value++
          })

          document.getElementById(`minus_${colorName}`).addEventListener('click', function (v) {
            var val = document.getElementById(`counter_${colorName}`)
            val.value > 0 ? val.value-- : null
          })

        })

      </script>

    </body>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多