【问题标题】:Javascript click on button to change backgroud colorJavascript单击按钮更改背景颜色
【发布时间】:2021-01-08 14:12:39
【问题描述】:

我想在这些按钮中一一单击并将它们的背景颜色更改为红色。如果我选择所有 A、B 和 C,那么每个按钮都应该变为红色。当我一一点击每个按钮时,它们会将颜色更改回默认颜色。

<button type="button">All</button>
<button type="button">A</button>
<button type="button">B</button>
<button type="button">C</button>

这是我的代码

optAll.addEventListener('click', function (e) {
    e.target.style.backgroundColor = "red";
    optA.style.backgroundColor = "red";
    optB.style.backgroundColor = "red";
    optC.style.backgroundColor = "red";
    optD.style.backgroundColor = "red";
});

【问题讨论】:

  • 代码不完整。不知道 OptAll、optA、optB ... 是如何定义的
  • 我喜欢人们重新发明复选框。

标签: javascript html


【解决方案1】:

您需要首先拆分分配点击处理程序的代码。

为避免不必要的查询,您可以查询一次,然后多次使用结果。

const main = document.querySelector('#all');
const ones = document.querySelectorAll('.one');

然后将处理程序分配给切换它们的按钮。它会通过迭代你得到的元素来切换它们。

我假设您还想切换“主”按钮,如果没有,请删除该行。

main.addEventListener('click', function (e) {
    e.target.style.backgroundColor = "red";
    ones.forEach( el => {
      el.style.backgroundColor = "red";
    });
});

然后是“切换一个”按钮,遍历它们并分配一个只影响被点击元素的处理程序。

ones.forEach( el => {
  el.addEventListener('click', function (e) {
    e.target.style.backgroundColor = "red";
  });
});

const main = document.querySelector('#all');
const ones = document.querySelectorAll('.one');
const updatedColor = 'red';
const originalColor = main.style.backgroundColor;

main.addEventListener('click', function (e) {
    updateColor(e.target);
    ones.forEach( el => {
      updateColor(el);
    });
});

ones.forEach( el => {
  el.addEventListener('click', function (e) {
    updateColor(el);
  });
});

// Update the element color based on the current color
function updateColor(el) {
  if (el.style.backgroundColor === originalColor) {
    el.style.backgroundColor = updatedColor;
  } else {
    el.style.backgroundColor = originalColor;
  }
}
<button id="all" type="button">All</button>
<button class="one" type="button">A</button>
<button class="one" type="button">B</button>
<button class="one" type="button">C</button>

更新:要处理在第二次或任何偶数次点击时返回原始颜色,我们可以首先将原始颜色存储在一个常量中。

const originalColor = main.style.backgroundColor;

然后使用该常量,有条件地更新按钮背景颜色,最好在单独的函数中进行,以避免重复。

function updateColor(el) {
  if (el.style.backgroundColor === originalColor) {
    el.style.backgroundColor = updatedColor;
  } else {
    el.style.backgroundColor = originalColor;
  }
}

【讨论】:

  • 这不处理取消选择的情况。
  • @costaparas 我错过了这部分问题,将更新答案。
【解决方案2】:

为此,您需要的不仅仅是一个事件。每个按钮都应该有一个单独的单击事件,并带有“红色”和“默认”的切换。

optA.addEventListener('click', function (e) {
  e.target.style.backgroundColor == 'red'?
    e.target.style.backgroundColor = 'default':
    e.target.style.backgroundColor = 'red';
});

optB.addEventListener('click', function (e) {
  e.target.style.backgroundColor == 'red'?
    e.target.style.backgroundColor = 'default':
    e.target.style.backgroundColor = 'red';
});

optC.addEventListener('click', function (e) {
  e.target.style.backgroundColor == 'red'?
    e.target.style.backgroundColor = 'default':
    e.target.style.backgroundColor = 'red';
});

我建议创建一个函数来切换背景,而不是像我刚才那样只使用 ctrl+c 和 ctrl+v

对于 "All" 按钮,您需要一个检查所有其他按钮背景的事件。

optAll.addEventListener('click', function (e) {
  (optA.style.backgroundColor == "red" && 
   optB.style.backgroundColor == "red" && 
   optC.style.backgroundColor == "red")?
     e.target.style.backgroundColor = 'red':
     e.target.style.backgroundColor = 'default';
});

我相信这样的事情应该可行。

【讨论】:

    【解决方案3】:

    let btn_all = document.getElementById("btn_all");
    let btn_A = document.getElementById("btn_A");
    let btn_B = document.getElementById("btn_B");
    let btn_C = document.getElementById("btn_C");
    
    let allButtons = [btn_all,btn_A,btn_B,btn_C];
    
    function changeColor (e) {
        let currentColor = e.target.style.backgroundColor;
        if (currentColor != "red") {
            e.target.style.backgroundColor = "red";
        }
        else {
            e.target.style.backgroundColor = "";
        }
        
    }
    function changeColorAll (e) {
        let currentColor = e.target.style.backgroundColor;
    
        if (currentColor != "red") {
            allButtons.forEach( function(element, index) {
                element.style.backgroundColor = 'red';
            });
        }
        else {
            allButtons.forEach( function(element, index) {
                element.style.backgroundColor = '';
            });
        }
    }
    
    btn_all.addEventListener("click", changeColorAll);
    btn_A.addEventListener("click", changeColor);
    btn_B.addEventListener("click", changeColor);
    btn_C.addEventListener("click", changeColor);
    <button type="button" id="btn_all">All</button>
    <button type="button" id="btn_A">A</button>
    <button type="button" id="btn_B">B</button>
    <button type="button" id="btn_C">C</button>
    https://stackoverflow.com/questions/65630594/javascript-click-on-button-to-change-backgroud-color#

    试试这个代码,您只需添加两个回调,一个用于所有其他按钮,一个用于“全部”按钮。在“所有”按钮回调中,您必须处理一个包含对所有按钮对象的引用的列表

    【讨论】:

      【解决方案4】:

      这是您需要的解决方案。此解决方案涉及for 循环。 要选择所有按钮,您将第一个按钮定义为optAll[0]

      optAll[0].onclick = function() {}
      

      选择每个按钮 - ABCfor 中的 All 除外循环,编号从1开始,而不是从0开始:

      for (var i = 1; i < optAll.length; i++) {}
      

      而且你只声明了一次按钮:

      let opt = document.querySelectorAll('button');
      

      let opt = document.querySelectorAll('button');
      
      opt[0].onclick = function() {
        for (var i = 0; i < opt.length; i++) {
          opt[i].style.backgroundColor = "red";
        }
      }
      
      for (var i = 1; i < opt.length; i++) {
        opt[i].onclick = function(event) {
          this.style.backgroundColor = "red";
        }
      }
      <button type="button">All</button>
      <button type="button">A</button>
      <button type="button">B</button>
      <button type="button">C</button>

      【讨论】:

        【解决方案5】:

        我将创建类 button-red 以便能够 toggle 类在原始颜色和红色之间来回切换。

        然后我会为每个按钮添加一个侦听器并创建一个变量optAll,其中可以存储所有按钮,以便我们可以循环遍历它以在单击所有button 时更改按钮的颜色。然后添加一个函数changeColor(btn) 来更改相关按钮的颜色,使整体更干净,并在每个侦听器中调用它。

        const optAll= document.querySelectorAll('.buttons');
        const optA=document.getElementById("optA");
        const optB=document.getElementById("optB");
        const optC=document.getElementById("optC");
        
        function changeColor(btn){
        btn.classList.toggle("button-red");
        }
        
        optAll[0].addEventListener('click', function (e) {
           optAll.forEach( btn => {
           changeColor(btn);
            });       
        });
        
        optA.addEventListener('click', function (e) { 
         changeColor(e.target);
        });
        optB.addEventListener('click', function (e) { 
         changeColor(e.target);
        });
        optC.addEventListener('click', function (e) { 
         changeColor(e.target);
        });
        .button-red {
            background-color:red
        }
        <button id="optAll" class="buttons" type="button">All</button>
        <button id="optA" class="buttons" type="button">A</button>
        <button id="optB" class="buttons" type="button">B</button>
        <button id="optC" class="buttons" type="button">C</button>

        【讨论】:

          【解决方案6】:

          您可以将按钮包装在 &lt;div&gt; 中,其中包含一个类,即 button-set。这样,您可以在单击按钮时访问e.target.target.parentElement 以获取包装 div。

          如果您激活“全部”选项,它将取消选择所有活动按钮。如果您激活任何其他按钮,它不会停用任何其他按钮,除非“全部”按钮已经处于活动状态。

          在下面的示例中,button.dataset.active 用于为给定按钮设置data-active 属性。此属性在停用时被删除。该属性还用作 CSS 规则,以在活动时直观地更改按钮的外观。

          const ButtonSet = selector => {
            const _buttonSet = document.querySelector(selector);
            const handleClick = e => {
              const button = e.target,
                group = button.parentElement,
                allButton = [...group.querySelectorAll('button')]
                  .find(button => button.textContent === 'All'),
                allActive = allButton.dataset.active === 'true',
                isActive = button.dataset.active === 'true';
              if (isActive) { delete button.dataset.active; }
              else { button.dataset.active = true; }
              if (button === allButton) {
                group.querySelectorAll('button').forEach(child => {
                  if (child !== button) { delete child.dataset.active; }
                });
              } else {
                if (allActive) { delete allButton.dataset.active; }
              }
            };
            _buttonSet.querySelectorAll('button')
              .forEach(button => button.addEventListener('click', handleClick));
            return _buttonSet;
          }
          
          const getButtonSetValue = ref => [...ref.querySelectorAll('button')]
            .filter(button => button.dataset.active === 'true')
            .map(button => button.textContent);
          
          ButtonSet('.button-set').addEventListener('click', e => {
            const value = getButtonSetValue(e.currentTarget);
            document.querySelector('#result > span').textContent = value.join(', ');
          });
          .as-console-wrapper { max-height: 4em !important; }
          
          :root {
            --button-set-active-color: #AAF;
            --button-set-active-hover-color: #CCF;
            --button-set-button-color: #EEE;
            --button-set-button-hover-color: #FFF;
          }
          
          .button-set {
            display: flex;
            flex-direction: row;
            border: thin solid grey;
            height: 1.5em;
          }
          
          .button-set button {
            width: 25%;
            border: none;
            border-right: thin solid grey;
            cursor: pointer;
            background: var(--button-set-button-color);
          }
          
          .button-set button:hover {
            background: var(--button-set-button-hover-color);
          }
          
          .button-set button:last-child {
            border-right: none;
          }
          
          .button-set button:focus {
            outline: 0;
          }
          
          .button-set button[data-active="true"] {
            background: var(--button-set-active-color);
          }
          
          .button-set button[data-active="true"]:hover {
            background: var(--button-set-active-hover-color);
          }
          
          #result {
            margin-top: 0.5em;
          }
          
          #result label {
            font-weight: bold;
          }
          <div class="button-set">
            <button>All</button>
            <button>A</button>
            <button>B</button>
            <button>C</button>
          </div>
          
          <div id="result">
            <label>Selected:</label>
            <span></span>
          </div>

          【讨论】:

            猜你喜欢
            • 2014-10-09
            • 2017-08-02
            • 2014-10-10
            • 1970-01-01
            • 2019-04-14
            • 2014-10-07
            • 2015-03-29
            • 1970-01-01
            相关资源
            最近更新 更多