Javascript 为我的测验创建一个上一个按钮

Javascript create a previous button for my quiz

我正在创建一个类似表格的测验,它快完成了。只有一件事我似乎无法弄清楚。我有下一个、上一个和结果按钮,但我似乎无法使上一个按钮起作用。

    function PrevQuestion() {
        let oldAnswerButton = document.querySelectorAll('.filter_anwser');

        // Deletes old question when the next question is clicked
        for (let answerButton of oldAnswerButton) {
            answerButton.style.display = 'none';
        }

        let question = Quiz[questionNumber];

        // Displays answers of the questions
        for (let y = question.chosenAnswer.length; y > 0; y--) {
            let item = question.chosenAnswer[0];
            // Display answer buttons
            let btn = document.createElement('button');
            btn.value = item.id;
            btn.className = "filter_anwser";
            btn.textContent = item.name;
            button.appendChild(btn);
        }

        // Displays Question
        questionName.textContent = question.questionDescription;
        questionName.id = "questionID";

        // Deletes 1 to see the previous question
        questionNumber--;

    }

您在此处看到的代码是属于与 onclick 链接的下一个按钮的函数。现在我试着编辑它,让它做完全相反的事情,并向我展示之前的问题和答案按钮,但它不起作用。该功能看起来应该有点像这样,但我就是想不通。有人可以帮助我吗?

完整代码:

<link rel="stylesheet" href="./style.css">
<div class="container">
    <div id="question"></div>
    <div id="answer"></div>
    <button onclick="NextQuestion()" id="nextbtn">Next</button>
    <button onclick="PrevQuestion()" id="prevbtn">Previous</button>
    <div id="finalLink"></div>
</div>
<script type="text/javascript">

    class QuizPart{
        constructor(questionDescription, chosenAnswer, prefix){
            this.questionDescription = questionDescription;
            this.chosenAnswer = chosenAnswer;
            this.prefix = prefix;
        }
    }
    
    class ChosenAnswer{
        constructor(id, name){
            this.id = id;
            this.name = name;
        }
    }

    let Quiz = [
        new QuizPart('Whats your size?', [
            new ChosenAnswer('6595', '41'),
            new ChosenAnswer('6598', '42'),
            new ChosenAnswer('6601', '43'),
        ], 'bd_shoe_size_ids='),

        new QuizPart('What color would you like?', [
            new ChosenAnswer('6053', 'Red'),
            new ChosenAnswer('6044', 'Blue'),
            new ChosenAnswer('6056', 'Yellow'),
            new ChosenAnswer('6048', 'Green'),
        ], 'color_ids='),

        new QuizPart('What brand would you like?', [
            new ChosenAnswer('5805', 'Adidas'),
            new ChosenAnswer('5866', 'Nike'),
            new ChosenAnswer('5875', 'Puma'),
        ], 'manufacturer_ids=')
    ]
    // console.log(Quiz);
    console.log(Quiz.length);

    let url = [];

    let questionNumber = 0;
    let button = document.getElementById('answer');
    let questionName = document.getElementById('question');
    let nextbtn = document.getElementById('nextbtn');
    let resultbtn = document.getElementById('FLink')

function NextQuestion() {
        let oldAnswerButton = document.querySelectorAll('.filter_anwser');

        // Deletes old question when the next question is clicked
        for (let answerButton of oldAnswerButton) {
            answerButton.style.display = 'none';
        }

        let question = Quiz[questionNumber];

        // Displays answers of the questions
        for (let y = 0; y < question.chosenAnswer.length; y++) {
            let item = question.chosenAnswer[y];
            // Display answer buttons
            let btn = document.createElement('button');
            btn.value = item.id;
            btn.className = "filter_anwser";
            btn.textContent = item.name;
            button.appendChild(btn);
        }
        // Check if your at the last question so the next button will stop being displayed.
        if(Quiz.length - 1 === questionNumber){
            nextbtn.style.display = 'none';
            resultbtn.style.display = 'grid';
        }

        // Displays Question
        questionName.textContent = question.questionDescription;
        questionName.id = "questionID";

        // adds 1 to question to see a different question
        questionNumber++;
}

    function PrevQuestion() {
        let oldAnswerButton = document.querySelectorAll('.filter_anwser');

        // Deletes old question when the next question is clicked
        for (let answerButton of oldAnswerButton) {
            answerButton.style.display = 'none';
        }

        let question = Quiz[questionNumber];

        // Displays answers of the questions
        for (let y = question.chosenAnswer.length; y > 0; y--) {
            let item = question.chosenAnswer[0];
            // Display answer buttons
            let btn = document.createElement('button');
            btn.value = item.id;
            btn.className = "filter_anwser";
            btn.textContent = item.name;
            button.appendChild(btn);
        }

        // Displays Question
        questionName.textContent = question.questionDescription;
        questionName.id = "questionID";

        // Deletes 1 to see the previous question
        questionNumber--;

    }

</script>

当你写一个for循环时,括号内有3个部分。第一部分声明一个作用域为循环的变量。第二部分是循环结束的条件。第三部分是每次循环后变量应该如何变化。

您可以在 NextQuestion:

中看到它完美运行

for (let y = 0; y < question.chosenAnswer.length; y++) { ... }

第一部分声明了一个名为 y 的变量并将其值设置为零。每次循环,第三部分 运行s,因此 y 变为 1,然后 2,依此类推。每次都检查第二部分以查看循环是否应该继续。如果 y 仍然小于 question.chosenAnswer 的长度,那么循环将再次 运行,但在某些时候 y 变得等于 question.chosenAnswer.length 并且循环停止.关键是 y 不会自动变大,它会变大,因为这是我们在循环的第三部分指定的。

现在让我们看看 PrevQuestion 中的循环:

for (let y = 0; y > question.chosenAnswer.length; y--) { ... }

再次 y 从零开始,但这次我们每次都减少它的值(使用 y--)所以它的值变成 -1 然后 -2 等等在。 y 不断变小,因此它永远不会大于 question.chosenAnswer.length,这将停止循环。这样做的结果是你的循环将无限地运行,并且循环之后的代码将永远不会执行。

在没有看到完整代码的情况下很难确定,但很可能您希望 y++NextQuestion 中的相同。另一种方法是保留 y-- 但更改变量的初始变量和结束条件。例如,这样就可以了:

for (let y = question.chosenAnswer.length; y > 0; y--) { ... }

哪种方式最适合您的情况仅取决于您希望 y 获取从 0question.chosenAnswer.length 的值的顺序 - 如果它应该从最小到最大,或者反过来。