>編碼自己的JavaScript測驗遊戲是一個很棒的學習練習。它教您如何處理事件,操縱DOM,處理用戶輸入,並使用本地存儲來跟踪其分數。當您進行基本的測驗啟動和運行時,會有很多可能添加更多高級功能的可能性,例如分頁。
> 在本教程中,我將介紹如何在JavaScript中進行測驗,以適應您的需求並添加到自己的網站上。如果您想查看我們的最終結果,可以向前跳過並查看工作的JavaScript測驗代碼。有關更多深入的JavaScript知識和挑戰,請獲得我們的免費書籍:學習與JavaScript進行編碼。
>開始
之前需要注意的事情在開始之前,這裡有幾件事要知道:
>本文中的代碼使用現代JavaScript語法(ES6),這意味著它與任何版本的Internet Explorer都不兼容。但是,它將在現代瀏覽器(包括Microsoft Edge)上工作。
如果您需要支持較舊的瀏覽器,我寫了與IE8兼容的JavaScript測驗教程。或者,如果您想在ES6上進行複習,請在SitePoint Premium上查看Darin Haener的這門課程。>一個用於處理所有交互功能的JavaScript文件。
>但是,如果您願意,您還可以將CSS和JavaScript代碼直接包含在HTML文件中,作為Inline Code。
在學習如何在HTML和JavaScript中進行測驗時,重要的是要了解HTML結構如何與JavaScript邏輯相互作用。因此,作為第一步,讓我們設置JavaScript測驗遊戲的HTML結構。
這是這樣的外觀:
><span><span><span><div</span> id<span>="quiz"</span>></span><span><span></div</span>></span> </span><span><span><span><button</span> id<span>="submit"</span>></span>Submit Quiz<span><span></button</span>></span> </span><span><span><span><div</span> id<span>="results"</span>></span><span><span></div</span>></span></span>
這個結構是如何創建測驗HTML代碼的簡單示例,該代碼是您的JavaScript測驗模板的基礎。如果您現在運行該應用程序,則只需看到一個“提交測驗”按鈕。
>現在,我們可以使用JavaScript document.getElementById方法來選擇上述HTML元素,並將對它們的引用存儲在JavaScript測驗代碼中:
<span>const quizContainer = document.getElementById('quiz'); </span><span>const resultsContainer = document.getElementById('results'); </span><span>const submitButton = document.getElementById('submit');</span>我們測驗應用程序需要的下一件事是要顯示一些問題。我們將使用JavaScript對象文字來表示單個問題和一個數組,以保存組成我們測驗應用程序的所有問題。使用陣列將使問題容易迭代:
可以隨意提出任意多的問題或答案。
<span>const myQuestions = [ </span> <span>{ </span> <span>question: "Who invented JavaScript?", </span> <span>answers: { </span> <span>a: "Douglas Crockford", </span> <span>b: "Sheryl Sandberg", </span> <span>c: "Brendan Eich" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which one of these is a JavaScript package manager?", </span> <span>answers: { </span> <span>a: "Node.js", </span> <span>b: "TypeScript", </span> <span>c: "npm" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which tool can you use to ensure code quality?", </span> <span>answers: { </span> <span>a: "Angular", </span> <span>b: "jQuery", </span> <span>c: "RequireJS", </span> <span>d: "ESLint" </span> <span>}, </span> <span>correctAnswer: "d" </span> <span>} </span><span>]; </span>>
>
note>:由於這是一個數組,這些問題將以列出的順序出現。如果您想在將問題呈現給用戶之前以任何方式對問題進行排序,請在> 上查看我們的快速提示。
>步驟3 - 構建測驗函數
>現在我們有了問題列表,我們可以在頁面上顯示它們。為此,我們將使用名為buildquix()的函數。讓我們逐行瀏覽以下JavaScript行以查看其工作原理:
>簡潔,我們正在使用箭頭功能在每個問題上執行我們的操作。因為這是在foreach循環中,所以我們獲得當前值,索引(數組中當前項目的位置編號)以及數組本身作為參數。我們只需要當前值和索引,出於我們的目的,我們將分別命名CurrentQuestion和問卷。
<span>function buildQuiz(){ </span> <span>// variable to store the HTML output </span> <span>const output = []; </span> <span>// for each question... </span> myQuestions<span>.forEach( </span> <span>(currentQuestion<span>, questionNumber</span>) => { </span> <span>// variable to store the list of possible answers </span> <span>const answers = []; </span> <span>// and for each available answer... </span> <span>for(letter in currentQuestion.answers){ </span> <span>// ...add an HTML radio button </span> answers<span>.push( </span> <span><span>`<label> </span></span><span><span> <input type="radio" name="question<span>${questionNumber}</span>" value="<span>${letter}</span>"> </span></span><span><span> <span>${letter}</span> : </span></span><span><span> <span>${currentQuestion.answers[letter]}</span> </span></span><span><span> </label>`</span> </span> <span>); </span> <span>} </span> <span>// add this question and its answers to the output </span> output<span>.push( </span> <span><span>`<div > <span>${currentQuestion.question}</span> </div> </span></span><span><span> <div > <span>${answers.join('')}</span> </div>`</span> </span> <span>); </span> <span>} </span> <span>); </span> <span>// finally combine our output list into one string of HTML and put it on the page </span> quizContainer<span>.innerHTML = output.join(''); </span><span>}</span>>
現在,讓我們看一下循環中的代碼:
對於每個問題,我們都需要生成正確的HTML。因此,我們的第一步是創建一個數組來保存可能的答案列表。
接下來,我們將使用一個循環來填寫當前問題的可能答案。對於每個選擇,我們都創建一個HTML廣播按鈕,我們將其包含在
>>在這裡,我們使用的模板文字是字符串,但功能更強大。我們將利用模板文字的以下功能:
>現在我們已經為每個問題生成了HTML,我們可以將所有問題加入其中並在頁面上顯示:
現在,我們的buildquiz函數已完成,您應該能夠運行測驗應用程序並查看顯示的問題。
但是,您的代碼結構很重要。由於所謂的時間死區,您無法在定義問題數組之前參考問題。
<span><span><span><div</span> id<span>="quiz"</span>></span><span><span></div</span>></span> </span><span><span><span><button</span> id<span>="submit"</span>></span>Submit Quiz<span><span></button</span>></span> </span><span><span><span><div</span> id<span>="results"</span>></span><span><span></div</span>></span></span>回顧一下,這是正確的結構:
>
首先,我們在測驗的HTML中選擇所有答案容器。然後,我們將創建變量以跟踪用戶當前答案和正確答案的總數。
>現在,我們可以循環瀏覽每個問題並檢查答案。
<span>const quizContainer = document.getElementById('quiz'); </span><span>const resultsContainer = document.getElementById('results'); </span><span>const submitButton = document.getElementById('submit');</span>>
在html中找到所選答案。
處理答案是正確的。
處理答案是錯誤的情況。<span>const myQuestions = [ </span> <span>{ </span> <span>question: "Who invented JavaScript?", </span> <span>answers: { </span> <span>a: "Douglas Crockford", </span> <span>b: "Sheryl Sandberg", </span> <span>c: "Brendan Eich" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which one of these is a JavaScript package manager?", </span> <span>answers: { </span> <span>a: "Node.js", </span> <span>b: "TypeScript", </span> <span>c: "npm" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which tool can you use to ensure code quality?", </span> <span>answers: { </span> <span>a: "Angular", </span> <span>b: "jQuery", </span> <span>c: "RequireJS", </span> <span>d: "ESLint" </span> <span>}, </span> <span>correctAnswer: "d" </span> <span>} </span><span>]; </span>
>讓我們更仔細地看一下我們如何在html中找到所選答案:
<span>function buildQuiz(){ </span> <span>// variable to store the HTML output </span> <span>const output = []; </span> <span>// for each question... </span> myQuestions<span>.forEach( </span> <span>(currentQuestion<span>, questionNumber</span>) => { </span> <span>// variable to store the list of possible answers </span> <span>const answers = []; </span> <span>// and for each available answer... </span> <span>for(letter in currentQuestion.answers){ </span> <span>// ...add an HTML radio button </span> answers<span>.push( </span> <span><span>`<label> </span></span><span><span> <input type="radio" name="question<span>${questionNumber}</span>" value="<span>${letter}</span>"> </span></span><span><span> <span>${letter}</span> : </span></span><span><span> <span>${currentQuestion.answers[letter]}</span> </span></span><span><span> </label>`</span> </span> <span>); </span> <span>} </span> <span>// add this question and its answers to the output </span> output<span>.push( </span> <span><span>`<div > <span>${currentQuestion.question}</span> </div> </span></span><span><span> <div > <span>${answers.join('')}</span> </div>`</span> </span> <span>); </span> <span>} </span> <span>); </span> <span>// finally combine our output list into one string of HTML and put it on the page </span> quizContainer<span>.innerHTML = output.join(''); </span><span>}</span>
首先,我們要確保我們在答案容器中查看當前問題。
在下一行中,我們定義一個CSS選擇器,該選擇器將使我們查看哪個廣播按鈕。 然後,我們正在使用JavaScript的QuerySelector在先前定義的AnswerContainer中搜索我們的CSS選擇器。本質上,這意味著我們會發現選中了哪個答案的廣播按鈕。
>>最後,我們可以通過使用.Value獲得該答案的值。
處理不完整的用戶輸入>用戶留下答案空白怎麼辦?在這種情況下,使用.value會導致錯誤,因為您無法獲得不存在的東西的值。為了解決這個問題,我們添加了||,意思是“或”,{}是一個空對象。現在,總體聲明說:
獲取對我們選定的答案元素的引用,或者如果不存在,請使用一個空對象。
獲取第一個語句中任何內容的值。>
>現在我們有一個工作JavaScript測驗!
<span><span><span><div</span> id<span>="quiz"</span>></span><span><span></div</span>></span> </span><span><span><span><button</span> id<span>="submit"</span>></span>Submit Quiz<span><span></button</span>></span> </span><span><span><span><div</span> id<span>="results"</span>></span><span><span></div</span>></span></span>
如果您願意,可以將整個測驗包裝在IIFE(立即調用函數表達式)中,該功能是在定義它後立即運行的函數。這將使您的變量不在全局範圍之外,並確保您的測驗應用不會干擾頁面上運行的任何其他腳本。
>現在您已經準備好了!隨意添加或刪除問題和答案,並按照您的意願進行測驗。
<span>const quizContainer = document.getElementById('quiz'); </span><span>const resultsContainer = document.getElementById('results'); </span><span>const submitButton = document.getElementById('submit');</span>現在,如果您運行了應用程序,則可以選擇答案並提交測驗以獲取結果。
<span>const myQuestions = [ </span> <span>{ </span> <span>question: "Who invented JavaScript?", </span> <span>answers: { </span> <span>a: "Douglas Crockford", </span> <span>b: "Sheryl Sandberg", </span> <span>c: "Brendan Eich" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which one of these is a JavaScript package manager?", </span> <span>answers: { </span> <span>a: "Node.js", </span> <span>b: "TypeScript", </span> <span>c: "npm" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which tool can you use to ensure code quality?", </span> <span>answers: { </span> <span>a: "Angular", </span> <span>b: "jQuery", </span> <span>c: "RequireJS", </span> <span>d: "ESLint" </span> <span>}, </span> <span>correctAnswer: "d" </span> <span>} </span><span>]; </span>>步驟5 - 添加樣式
以來,我們進行了一個工作測驗,讓我們通過添加一些樣式使其更加用戶友好。但是,我不會詳細介紹每種樣式的細節。您可以將以下代碼直接複製到styles.css文件中。
>
在這一點上,您的測驗看起來像這樣(帶有一點點樣式)為此,您需要:
一種顯示和隱藏問題的方法。
下一
接下來,我們可以使用一些CSS定位使幻燈片坐在彼此的層上。在此示例中,您會注意到我們正在使用Z indexes和不透明度過渡來允許我們的幻燈片逐漸消失。 CSS可能是這樣的:<span><span><span><div</span> id<span>="quiz"</span>></span><span><span></div</span>></span> </span><span><span><span><button</span> id<span>="submit"</span>></span>Submit Quiz<span><span></button</span>></span> </span><span><span><span><div</span> id<span>="results"</span>></span><span><span></div</span>></span></span>>
>現在,我們將添加一些JavaScript來使分頁工作。和以前一樣,訂單很重要,因此這是我們代碼的修訂結構:
>我們可以從一些變量開始,以存儲我們導航按鈕的引用,並跟踪我們正在使用的幻燈片。如上圖所示,將其添加到Buildquiz()之後:
<span>const quizContainer = document.getElementById('quiz'); </span><span>const resultsContainer = document.getElementById('results'); </span><span>const submitButton = document.getElementById('submit');</span>>
接下來,我們將編寫一個函數以顯示幻燈片。將其添加到現有函數(buildquiz and ShowResults)下方:
<span>const myQuestions = [ </span> <span>{ </span> <span>question: "Who invented JavaScript?", </span> <span>answers: { </span> <span>a: "Douglas Crockford", </span> <span>b: "Sheryl Sandberg", </span> <span>c: "Brendan Eich" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which one of these is a JavaScript package manager?", </span> <span>answers: { </span> <span>a: "Node.js", </span> <span>b: "TypeScript", </span> <span>c: "npm" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which tool can you use to ensure code quality?", </span> <span>answers: { </span> <span>a: "Angular", </span> <span>b: "jQuery", </span> <span>c: "RequireJS", </span> <span>d: "ESLint" </span> <span>}, </span> <span>correctAnswer: "d" </span> <span>} </span><span>]; </span>
這是前三行的作用:
><span>function buildQuiz(){ </span> <span>// variable to store the HTML output </span> <span>const output = []; </span> <span>// for each question... </span> myQuestions<span>.forEach( </span> <span>(currentQuestion<span>, questionNumber</span>) => { </span> <span>// variable to store the list of possible answers </span> <span>const answers = []; </span> <span>// and for each available answer... </span> <span>for(letter in currentQuestion.answers){ </span> <span>// ...add an HTML radio button </span> answers<span>.push( </span> <span><span>`<label> </span></span><span><span> <input type="radio" name="question<span>${questionNumber}</span>" value="<span>${letter}</span>"> </span></span><span><span> <span>${letter}</span> : </span></span><span><span> <span>${currentQuestion.answers[letter]}</span> </span></span><span><span> </label>`</span> </span> <span>); </span> <span>} </span> <span>// add this question and its answers to the output </span> output<span>.push( </span> <span><span>`<div > <span>${currentQuestion.question}</span> </div> </span></span><span><span> <div > <span>${answers.join('')}</span> </div>`</span> </span> <span>); </span> <span>} </span> <span>); </span> <span>// finally combine our output list into one string of HTML and put it on the page </span> quizContainer<span>.innerHTML = output.join(''); </span><span>}</span>
>通過刪除Active-Slide類,隱藏當前的幻燈片。
通過添加Active-Slide類顯示新的幻燈片。myQuestions<span>.forEach( (currentQuestion<span>, questionNumber</span>) => { </span> <span>// the code we want to run for each question goes here </span><span>});</span>>
更新當前的幻燈片。
<span>// we'll want to store the list of answer choices </span><span>const answers = []; </span> <span>// and for each available answer... </span><span>for(letter in currentQuestion.answers){ </span> <span>// ...add an html radio button </span> answers<span>.push( </span> <span><span>`<label> </span></span><span><span> <input type="radio" name="question<span>${questionNumber}</span>" value="<span>${letter}</span>"> </span></span><span><span> <span>${letter}</span> : </span></span><span><span> <span>${currentQuestion.answers[letter]}</span> </span></span><span><span> </label>`</span> </span> <span>); </span><span>} </span> <span>// add this question and its answers to the output </span>output<span>.push( </span> <span><span>`<div > <span>${currentQuestion.question}</span> </div> </span></span><span><span> <div > <span>${answers.join('')}</span> </div>`</span> </span><span>); </span>
下一行介紹以下JavaScript邏輯:
> submit
按鈕。否則,顯示>最後,我們需要將導航按鈕連接到這些功能上。這是在代碼末尾出現的:
<span><span><span><div</span> id<span>="quiz"</span>></span><span><span></div</span>></span> </span><span><span><span><button</span> id<span>="submit"</span>></span>Submit Quiz<span><span></button</span>></span> </span><span><span><span><div</span> id<span>="results"</span>></span><span><span></div</span>></span></span>
現在您的測驗有工作導航!
>現在您有了一個基本的JavaScript測驗應用程序,是時候獲得創造性和實驗了。
>以下是您可以嘗試的一些建議:
>如何在測驗中隨機化問題的順序?
<span>const quizContainer = document.getElementById('quiz'); </span><span>const resultsContainer = document.getElementById('results'); </span><span>const submitButton = document.getElementById('submit');</span>
隨機解決問題的順序可以使您的測驗更具挑戰性和樂趣。您可以使用Sort()方法與Math.random()函數結合使用。您可以做到這一點:
如何在測驗中添加計時器?
<span>const myQuestions = [ </span> <span>{ </span> <span>question: "Who invented JavaScript?", </span> <span>answers: { </span> <span>a: "Douglas Crockford", </span> <span>b: "Sheryl Sandberg", </span> <span>c: "Brendan Eich" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which one of these is a JavaScript package manager?", </span> <span>answers: { </span> <span>a: "Node.js", </span> <span>b: "TypeScript", </span> <span>c: "npm" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which tool can you use to ensure code quality?", </span> <span>answers: { </span> <span>a: "Angular", </span> <span>b: "jQuery", </span> <span>c: "RequireJS", </span> <span>d: "ESLint" </span> <span>}, </span> <span>correctAnswer: "d" </span> <span>} </span><span>]; </span>添加計時器可以使您的測驗更加令人興奮。您可以使用JavaScript SetInterval()函數輕鬆地將計時器添加到測驗中。這是一個簡單的例子:
在此示例中,測驗將持續30秒。計時器每秒都會更新,當時間到了,將顯示警報。
>您可以通過修改checkanswer()函數來顯示正確的答案。您可以在IF語句中添加其他子句,該子句檢查答案是否正確。您可以做到這一點:
<span><span><span><div</span> id<span>="quiz"</span>></span><span><span></div</span>></span> </span><span><span><span><button</span> id<span>="submit"</span>></span>Submit Quiz<span><span></button</span>></span> </span><span><span><span><div</span> id<span>="results"</span>></span><span><span></div</span>></span></span>
在此示例中,如果用戶的答案不正確,則會以正確的答案顯示警報。
<span>const quizContainer = document.getElementById('quiz'); </span><span>const resultsContainer = document.getElementById('results'); </span><span>const submitButton = document.getElementById('submit');</span>在您的html中,您可以顯示這樣的圖像:
>
在顯示新問題時,您可以在JavaScript中更新圖像的src屬性:<span>const myQuestions = [ </span> <span>{ </span> <span>question: "Who invented JavaScript?", </span> <span>answers: { </span> <span>a: "Douglas Crockford", </span> <span>b: "Sheryl Sandberg", </span> <span>c: "Brendan Eich" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which one of these is a JavaScript package manager?", </span> <span>answers: { </span> <span>a: "Node.js", </span> <span>b: "TypeScript", </span> <span>c: "npm" </span> <span>}, </span> <span>correctAnswer: "c" </span> <span>}, </span> <span>{ </span> <span>question: "Which tool can you use to ensure code quality?", </span> <span>answers: { </span> <span>a: "Angular", </span> <span>b: "jQuery", </span> <span>c: "RequireJS", </span> <span>d: "ESLint" </span> <span>}, </span> <span>correctAnswer: "d" </span> <span>} </span><span>]; </span>
在此示例中,顯示問題時將顯示大象的圖像。
我如何處理JavaScript測驗中的多個正確答案?<span>function buildQuiz(){ </span> <span>// variable to store the HTML output </span> <span>const output = []; </span> <span>// for each question... </span> myQuestions<span>.forEach( </span> <span>(currentQuestion<span>, questionNumber</span>) => { </span> <span>// variable to store the list of possible answers </span> <span>const answers = []; </span> <span>// and for each available answer... </span> <span>for(letter in currentQuestion.answers){ </span> <span>// ...add an HTML radio button </span> answers<span>.push( </span> <span><span>`<label> </span></span><span><span> <input type="radio" name="question<span>${questionNumber}</span>" value="<span>${letter}</span>"> </span></span><span><span> <span>${letter}</span> : </span></span><span><span> <span>${currentQuestion.answers[letter]}</span> </span></span><span><span> </label>`</span> </span> <span>); </span> <span>} </span> <span>// add this question and its answers to the output </span> output<span>.push( </span> <span><span>`<div > <span>${currentQuestion.question}</span> </div> </span></span><span><span> <div > <span>${answers.join('')}</span> </div>`</span> </span> <span>); </span> <span>} </span> <span>); </span> <span>// finally combine our output list into one string of HTML and put it on the page </span> quizContainer<span>.innerHTML = output.join(''); </span><span>}</span>
>處理多個正確的答案涉及允許用戶選擇多個答案並檢查所選答案是否正確。例如,您可以如何更新上面的ShowResults()函數來處理多個正確的答案。
>維護單獨的JavaScript和CSS文件不是必須的。但是,通常認為這是一個最佳實踐,因為它可以提高您的代碼的可讀性和可維護性。
以上是如何製作簡單的JavaScript測驗:代碼教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!