【问题标题】:Javascript onclick how to undo when clicked againJavascript onclick如何在再次单击时撤消
【发布时间】:2022-01-14 02:45:58
【问题描述】:

我正在创建一个过滤器,通过回答问题来搜索您的完美鞋子。现在我有几个问题,每个问题都有多个答案。通过单击答案,可以使用该答案值的数据编辑变量。问题是您可以根据需要多次单击变量,并且该值将不断添加。有没有办法在单击时更改答案按钮的颜色,再次单击时会撤消将值添加到变量并更改颜色?

代码:

<div class="container">
    <div id="question"></div>
    <div id="answer"></div>
    <button onclick="check()" id="nextbtn">Next</button>
    <div id="finalLink"></div>      
</div>
<script type="text/javascript">

    var ShoeTest = [
        [
            'Whats your size?',
            ['41', '41'],
            ['42', '42'],
            ['43', '43']
        ],
        [
            'What color would you like?',
            ['Red', 'red'],
            ['Blue', 'blue'],
            ['Yellow', 'yellow'],
            ['Green', 'green']
        ],
        [
            'What brand would you like?',
            ['Adidas', 'adidas'],
            ['Nike', 'nike'],
            ['Puma', 'puma']
        ]
    ];

    let parms = [];

    count = 1;
    var questionNumber = 0;
    var button = document.getElementById('answer');
    var question = document.getElementById('question');
    var answerButton;
    var flag = true;

    function getLink(parms) {
        return ""+parms.join("&")
      };

      button.addEventListener("click",function(e) {
        const tgt = e.target;
        parms.push(tgt.value);
        console.log(getLink(parms))
      })

    function check(){
        oldAnswerButton = document.querySelectorAll('.filter_anwser');
        oldQuestion = document.getElementById('question');
        for(let z = 0; z < oldAnswerButton.length; z++){
            oldAnswerButton[z].style.display = 'none';
        }
        //question 
        for (let y = 1; y < ShoeTest[questionNumber].length; y++){
            // button
            var btn = document.createElement('button');
            btn.value = ShoeTest[questionNumber][y][1];
            btn.className = "filter_anwser";
            btn.textContent = ShoeTest[questionNumber][y][0];
            btn.setAttribute('data-el', 1);
            btn.onclick = ButtonColor();
            button.appendChild(btn);
            // class
            answerButton = document.querySelectorAll('.filter_anwser');
        }
        // question
        question.textContent = ShoeTest[questionNumber][0];
        question.id = "questionID";
                
        console.log(".....");
        // adds 1 to question to see a different question
        questionNumber++;
    }

    function ButtonColor(){
        btn = document.getElementById('answer');
        btn.style.backgroundcolor = flag ? "unclicked" : "clicked"
       flag = !flag;
    }

另外,如果您对一个问题有多个答案,请在之间添加一个 , 而不是 &?

【问题讨论】:

  • 您基本上是在询问如何跟踪开关是否打开。您可以使用(布尔)变量来执行此操作,或者通过向按钮添加(和删除)一个类(这也可以用于应用不同的样式规则,因此在这里将是一个完美的解决方案)。如果搜索参数由所有开关状态组成,您可以在每次切换开关时简单地重新运行。从简单开始并实现一个基本的切换按钮,然后从那里开始。

标签: javascript arrays variables undo


【解决方案1】:

更新

这是基于 cmets 的更新后的 sn-p。更改您的事件侦听器函数,如下所示:

button.addEventListener("click", function(e) {
  const tgt = e.target;
  if (parms && parms.indexOf(tgt.value) == -1) {
    parms.push(tgt.value);
    e.target.style.backgroundColor = "red";
  } else {
    parms.splice(parms.indexOf(tgt.value), 1)
    e.target.style.backgroundColor = "white";
  }
  console.log(getLink(parms))
})

以前

根据您的问题,我可以理解您正在寻找单击时更改按钮颜色并再次单击(撤消)。并更新单击并再次单击(撤消)时发生的值。这是一个更简化的示例,您可以将其应用于您的问题:

var flag = true;
function changeColorAndValue() {
    flag = !flag;
    document.getElementById("myButton").style.background = flag ? 'yellow' : 'blue';
}
&lt;button id="myButton" onclick="changeColorAndValue()"&gt;Click&lt;/button&gt;

【讨论】:

  • Tnx 但我已经尝试过这样做,但它不起作用。可能是因为按钮是在我的函数中自动生成的。这会改变颜色,但还有一种方法可以撤消整个功能吗?
  • 我已经更新了答案。这会在第二次单击时切换颜色并撤消添加的值。希望你需要这个
  • 谢谢!它完美地工作。就一个问题。您是否知道一种方法来检查单击的答案是否与另一个单击的答案来自同一个问题,以便我可以在它们之间添加 , 而不是 & ?
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多