有没有办法删除一个按钮,然后重新创建它以使用 JavaScript 生成不同的文本?

Is there a way to remove a button and then recreate it to generate different text with JavaScript?

提问人:Ryan Caltabiano 提问时间:9/22/2023 更新时间:9/22/2023 访问量:31

问:

这是我的第一篇文章,我对 JavaScript 非常陌生。对于作业,我需要创建一个包含多个问题的多项选择测验。我的代码从对象数组中提取,并创建具有四个答案选项的按钮。我的问题(无论如何其中之一)是正确回答后,按钮不会消失,而是该功能在它们下面添加了更多按钮。我希望删除创建的按钮,以便在正确回答问题后将它们替换为下一系列按钮。我尝试了 .remove 方法,但我唯一能做的方法是通过删除所有方法的 div ID,当我尝试 getElementsByClassName 时,我遇到了一个错误。这绝对是由于我缺乏经验,但如果有人能帮助我解决这个问题,我将不胜感激。我需要使用香草 JS,请不要使用 jQuery。这就是我在尝试实验后冲突的代码目前的样子。如果我需要提供更多信息,我可以。谢谢!

function renderQuestion() {
    var newQuestion = document.getElementById("question");
    var newAnswers = document.getElementById("answerBtns");
        newQuestion.textContent = questions[currentQuestion].question;
        for (i = 0; i < questions[currentQuestion].answers.length; i++){
        let btnEl = document.createElement('button');
        btnEl.setAttribute("class", "btn btn-success bg-gradient btn-lg");
        btnEl.setAttribute("value", questions[currentQuestion].answers[i]);
        btnEl.textContent = questions[currentQuestion].answers[i];
        newAnswers.append(btnEl);
        btnEl.addEventListener("click", answerCheck);
        }
};


//Function to check chosen answer with answer in data

function answerCheck(btnEl) {
    // var btnEl = document.getElementsByClassName(".btn")
    if (questions[currentQuestion].correct == btnEl.target.textContent) {
        score += 1;
        console.log("Correct! You got this! Your score is " + score);
        let element = document.querySelectorAll("button");
        element.remove()
        currentQuestion++
        renderQuestion();
    } else {
        secondsLeft -= 5;
        console.log("Wrong :( Try again!");
    }
JavaScript 数组 for 循环 按钮 方法

评论

0赞 jmsm1g19 9/22/2023
嗨,欢迎来到社区。几条评论:您在 for 循环中使用了 i,而没有用 let、var 或 const 声明它。这可能会导致问题,因为我将在全局范围内。始终声明循环变量以避免意外行为。您还希望循环访问和删除按钮。当您尝试使用 element.remove() 时,它将不起作用,因为 remove 是单个元素的方法,而不是 NodeList 的方法。您需要遍历 NodeList 并在每个按钮上调用 remove。
1赞 Barmar 9/22/2023
不要每次都添加新按钮。在原始 HTML 中创建按钮。然后,您可以通过分配到 或 来更改其文本。.innerHTML.innerText
0赞 imvain2 9/22/2023
除非作业有特定要求,否则@Barmar建议将是您最简单的解决方案。您需要考虑的唯一警告是,您的所有问题是否具有相同数量的潜在答案选项。
0赞 Barmar 9/22/2023
无论如何,简单的解决方案是在为下一个问题添加按钮之前执行。这将删除所有旧按钮。newAnswers.innerHTML = ''
0赞 Ryan Caltabiano 9/27/2023
谢谢大家的帮助!我知道必须有一种更有效/更有效的方法来解决这个问题,但到那时,我的时间所剩无几,而且在 JS 方面的知识/经验也很少,我必须在截止日期之前使用它。这不是我最初的想法,但它是当时在我的范围内可行的想法。不过我学到了很多东西,谢谢!

答:

0赞 David 9/22/2023 #1

该函数返回所有元素的列表,然后尝试删除该列表。但旨在调用单个元素。您可以遍历列表并调用每个项目,或者使用 @barbar 的第二个建议来清空包装答案的 div。checkAnswer()<button>.remove().remove()

另外,友情提示:参数的行为与CSS完全相同,因此通过传递它,您将获得整个页面上所有元素的列表。如果除了答案之外还有其他按钮,则可能会有问题。.querySelectorAll()"button"<button>