{"id":97,"date":"2020-04-02T08:58:36","date_gmt":"2020-04-02T08:58:36","guid":{"rendered":"https:\/\/www.kindsonthegenius.com\/javascript\/?p=97"},"modified":"2020-08-06T06:03:06","modified_gmt":"2020-08-06T06:03:06","slug":"build-a-quiz-app-store-data-in-client-side-indexeddb","status":"publish","type":"post","link":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/","title":{"rendered":"Build a Quiz App &#8211; Store Data in Client-Side IndexedDB"},"content":{"rendered":"<p>In the previous tutorials, I explained how to build a quiz application. You can review them here.<\/p>\n<p><a href=\"https:\/\/www.kindsonthegenius.com\/javascript\/quiz-app-in-javascript-step-by-step-with-all-codes\/\">First Quiz App\u00a0<\/a><\/p>\n<p><a href=\"https:\/\/www.kindsonthegenius.com\/javascript\/quiz-application-in-javascript-with-validation-step-by-step\/\">Second Quiz App &#8211; with more features<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>We would then cover the following:<\/p>\n<ol>\n<li><a href=\"#t1\">Creating the index.html and Stylesheet<\/a><\/li>\n<li><a href=\"#t2\">Building the QuestionManager.js Script<\/a><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h5><strong id=\"t1\">1. Create the index.html File and the Stylesheet<\/strong><\/h5>\n<p>These have been explained in the previous part. So I would not spend time here. Meanwhile here are the two files:<\/p>\n<p><a href=\"https:\/\/drive.google.com\/open?id=1Mt536Klmkk1NvsU4oF0mE8JXy_Pe2RP6\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"broken_link\">index.html<\/a>: You can create the html file and paste the content\u00a0 of this file<\/p>\n<p><a href=\"https:\/\/drive.google.com\/open?id=1_qFcAaVy_bOEJaF4S8PIOkl_xuoUZXGp\" target=\"_blank\" rel=\"noopener noreferrer\">styles.css<\/a>: Do same<\/p>\n<p><a href=\"https:\/\/drive.google.com\/open?id=1u8nu5IZs8UZUXahT-KRZo7mO_THmyQuw\">scripts.js<\/a>: this is the script that controls the quiz. It&#8217;s explained in <a href=\"https:\/\/www.kindsonthegenius.com\/javascript\/quiz-app-in-javascript-step-by-step-with-all-codes\/\">Part 1<\/a><\/p>\n<p>Now you can preview the index.html page<\/p>\n<p>&nbsp;<\/p>\n<p><strong>The Question Manager HTML<\/strong><\/p>\n<p>This is where we would be able to add and delete a quiz from the database. As mentioned, the database would be IndexedDB, which is a client-side database embedded in the browsers.<\/p>\n<p>First create a html page, QuizManager.html.<\/p>\n<p>Here is the content of the body section below:<\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"header\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;a<\/span> <span style=\"color: #0000cc;\">href=<\/span><span style=\"background-color: #fff0f0;\">\"start.html\"<\/span><span style=\"color: #007700;\">&gt;<\/span> Home<span style=\"color: #007700;\">&lt;\/a&gt;<\/span> |\r\n    <span style=\"color: #007700;\">&lt;a<\/span> <span style=\"color: #0000cc;\">href=<\/span><span style=\"background-color: #fff0f0;\">\"game.html\"<\/span><span style=\"color: #007700;\">&gt;<\/span> Game<span style=\"color: #007700;\">&lt;\/a&gt;<\/span> |\r\n    <span style=\"color: #007700;\">&lt;a<\/span> <span style=\"color: #0000cc;\">href=<\/span><span style=\"background-color: #fff0f0;\">\"index.html\"<\/span><span style=\"color: #007700;\">&gt;<\/span> Quiz<span style=\"color: #007700;\">&lt;\/a&gt;<\/span> |\r\n    <span style=\"color: #007700;\">&lt;a<\/span> <span style=\"color: #0000cc;\">href=<\/span><span style=\"background-color: #fff0f0;\">\"questionsManager.html\"<\/span><span style=\"color: #007700;\">&gt;<\/span> Questions Manager<span style=\"color: #007700;\">&lt;\/a&gt;<\/span>\r\n<span style=\"color: #007700;\">&lt;\/div&gt;<\/span>    \r\n<span style=\"color: #007700;\">&lt;center&gt;&lt;h4&gt;<\/span>Available Questions<span style=\"color: #007700;\">&lt;\/h4&gt;&lt;\/center&gt;<\/span>\r\n<span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">id=<\/span><span style=\"background-color: #fff0f0;\">\"questionBox\"<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"questionList\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n<span style=\"color: #007700;\">&lt;\/div&gt;<\/span>\r\n<span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"ui form entryForm\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;center&gt;&lt;h4&gt;<\/span>Add New Question<span style=\"color: #007700;\">&lt;\/h4&gt;&lt;\/center&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"field\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n      <span style=\"color: #007700;\">&lt;input<\/span> <span style=\"color: #0000cc;\">type=<\/span><span style=\"background-color: #fff0f0;\">\"text\"<\/span> <span style=\"color: #0000cc;\">id=<\/span><span style=\"background-color: #fff0f0;\">\"addQuestion\"<\/span> <span style=\"color: #0000cc;\">placeholder=<\/span><span style=\"background-color: #fff0f0;\">\"Question\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;\/div&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;hr<\/span> <span style=\"color: #007700;\">\/&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"field\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n      <span style=\"color: #007700;\">&lt;input<\/span> <span style=\"color: #0000cc;\">type=<\/span><span style=\"background-color: #fff0f0;\">\"text\"<\/span> <span style=\"color: #0000cc;\">id=<\/span><span style=\"background-color: #fff0f0;\">\"addOption1\"<\/span> <span style=\"color: #0000cc;\">placeholder=<\/span><span style=\"background-color: #fff0f0;\">\"Option 1\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;\/div&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"field\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n        <span style=\"color: #007700;\">&lt;input<\/span> <span style=\"color: #0000cc;\">type=<\/span><span style=\"background-color: #fff0f0;\">\"text\"<\/span> <span style=\"color: #0000cc;\">id=<\/span><span style=\"background-color: #fff0f0;\">\"addOption2\"<\/span> <span style=\"color: #0000cc;\">placeholder=<\/span><span style=\"background-color: #fff0f0;\">\"Option 2\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n      <span style=\"color: #007700;\">&lt;\/div&gt;<\/span>        \r\n      <span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"field\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n        <span style=\"color: #007700;\">&lt;input<\/span> <span style=\"color: #0000cc;\">type=<\/span><span style=\"background-color: #fff0f0;\">\"text\"<\/span> <span style=\"color: #0000cc;\">id=<\/span><span style=\"background-color: #fff0f0;\">\"addOption3\"<\/span> <span style=\"color: #0000cc;\">placeholder=<\/span><span style=\"background-color: #fff0f0;\">\"Option 3\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n      <span style=\"color: #007700;\">&lt;\/div&gt;<\/span>        \r\n      <span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"field\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n        <span style=\"color: #007700;\">&lt;input<\/span> <span style=\"color: #0000cc;\">type=<\/span><span style=\"background-color: #fff0f0;\">\"text\"<\/span> <span style=\"color: #0000cc;\">id=<\/span><span style=\"background-color: #fff0f0;\">\"addOption4\"<\/span> <span style=\"color: #0000cc;\">placeholder=<\/span><span style=\"background-color: #fff0f0;\">\"Option 4\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n      <span style=\"color: #007700;\">&lt;\/div&gt;<\/span>\r\n      <span style=\"color: #007700;\">&lt;hr<\/span> <span style=\"color: #007700;\">\/&gt;<\/span>\r\n      <span style=\"color: #007700;\">&lt;div<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"field\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n        <span style=\"color: #007700;\">&lt;input<\/span> <span style=\"color: #0000cc;\">type=<\/span><span style=\"background-color: #fff0f0;\">\"text\"<\/span> <span style=\"color: #0000cc;\">id=<\/span><span style=\"background-color: #fff0f0;\">\"addAnswer\"<\/span> <span style=\"color: #0000cc;\">placeholder=<\/span><span style=\"background-color: #fff0f0;\">\"Answer\"<\/span><span style=\"color: #007700;\">&gt;<\/span>\r\n      <span style=\"color: #007700;\">&lt;\/div&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;hr<\/span> <span style=\"color: #007700;\">\/&gt;<\/span>\r\n    <span style=\"color: #007700;\">&lt;button<\/span> <span style=\"color: #0000cc;\">onclick=<\/span><span style=\"background-color: #fff0f0;\">\"addQuestionHandler()\"<\/span> <span style=\"color: #0000cc;\">class=<\/span><span style=\"background-color: #fff0f0;\">\"ui button\"<\/span> <span style=\"color: #007700;\">&gt;<\/span>Add Question<span style=\"color: #007700;\">&lt;\/button&gt;<\/span>\r\n<span style=\"color: #007700;\">&lt;\/div&gt;<\/span>\r\n<span style=\"color: #007700;\">&lt;script <\/span><span style=\"color: #0000cc;\">src=<\/span><span style=\"background-color: #fff0f0;\">\"questionsManager.js\"<\/span><span style=\"color: #007700;\">&gt;&lt;\/script&gt;<\/span>\r\n<\/pre>\n<p>Go ahead to preview the html page.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Link the Stylesheet<\/strong><\/p>\n<p>Next, you need to add the link to the styles.css file to the header section. I also added the semantic ui cdn link as well. We use the sematic ui, for some styling.<\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #007700;\">&lt;link<\/span> <span style=\"color: #0000cc;\">rel=<\/span><span style=\"background-color: #fff0f0;\">\"stylesheet\"<\/span> \r\n<span style=\"color: #0000cc;\">href=<\/span><span style=\"background-color: #fff0f0;\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/semantic-ui\/2.4.1\/semantic.min.css\"<\/span> \r\n<span style=\"color: #0000cc;\">integrity=<\/span><span style=\"background-color: #fff0f0;\">\"sha256-9mbkOfVho3ZPXfM7W8sV2SndrGDuh7wuyLjtsWeTI1Q=\"<\/span> \r\n<span style=\"color: #0000cc;\">crossorigin=<\/span><span style=\"background-color: #fff0f0;\">\"anonymous\"<\/span> <span style=\"color: #007700;\">\/&gt;<\/span>\r\n<span style=\"color: #007700;\">&lt;link<\/span> <span style=\"color: #0000cc;\">rel=<\/span><span style=\"background-color: #fff0f0;\">\"stylesheet\"<\/span> <span style=\"color: #0000cc;\">href=<\/span><span style=\"background-color: #fff0f0;\">\"styles.css\"<\/span> <span style=\"color: #007700;\">\/&gt;<\/span>\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h5><strong id=\"t2\">2. The Question Manager JavaScript File<\/strong><\/h5>\n<p>Here is where we would write the logic to manipulate the database. So we would open the database, read the content and load it into the ui. Also, we would have a function to insert a new question.<\/p>\n<p>You need to pay attention to this part. However, I have simplified it by breaking the code down into nine sections.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>1. Open Request<\/strong><\/p>\n<p>The first step is to create a request object to open the database. We also declare a variable db to hold the response. If the database does not exist, it is created.<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/1. Request to open the database, <\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> request <span style=\"color: #333333;\">=<\/span> <span style=\"color: #007020;\">window<\/span>.indexedDB.open(<span style=\"background-color: #fff0f0;\">\"questionsDB\"<\/span>, <span style=\"color: #0000dd; font-weight: bold;\">1<\/span>) \r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> db;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>2. Open Succeeded<\/strong><\/p>\n<p>Specify what happens if the open request succeeded. In this case, we just read the question from the database and display them.<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/2. The database is opened normally<\/span>\r\nrequest.onsuccess <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">function<\/span>(event) {\r\n    db <span style=\"color: #333333;\">=<\/span> event.target.result\r\n    loadQuestion(db)\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>3. Schema Changed<\/strong><\/p>\n<p>We also need to do this. This is in case, the database if being opened for the firs time. So we create an objectStore named questions<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/3. The schema is changing or this is the firs time<\/span>\r\nrequest.onupgradeneeded <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">function<\/span>(event){\r\n    db <span style=\"color: #333333;\">=<\/span> event.target.result;\r\n    db.createObjectStore(<span style=\"background-color: #fff0f0;\">\"questions\"<\/span>, { keyPath <span style=\"color: #333333;\">:<\/span> <span style=\"background-color: #fff0f0;\">\"id\"<\/span> });    \r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>4. Declare Elements<\/strong><\/p>\n<p>These are just the ui elements where we&#8217;ll display the question details as well as the options.<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/4. Declare the elements for the question and options<\/span>\r\n<span style=\"color: #888888;\">\/\/questionText, opt1, opt2, opt3, opt4, answer<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> questionText <span style=\"color: #333333;\">=<\/span> <span style=\"color: #007020;\">document<\/span>.getElementById(<span style=\"background-color: #fff0f0;\">\"addQuestion\"<\/span>)\r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> opt1 <span style=\"color: #333333;\">=<\/span> <span style=\"color: #007020;\">document<\/span>.getElementById(<span style=\"background-color: #fff0f0;\">'addOption1'<\/span>)\r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> opt2 <span style=\"color: #333333;\">=<\/span> <span style=\"color: #007020;\">document<\/span>.getElementById(<span style=\"background-color: #fff0f0;\">'addOption2'<\/span>)\r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> opt3 <span style=\"color: #333333;\">=<\/span> <span style=\"color: #007020;\">document<\/span>.getElementById(<span style=\"background-color: #fff0f0;\">'addOption3'<\/span>)\r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> opt4 <span style=\"color: #333333;\">=<\/span> <span style=\"color: #007020;\">document<\/span>.getElementById(<span style=\"background-color: #fff0f0;\">'addOption4'<\/span>)\r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> answer <span style=\"color: #333333;\">=<\/span> <span style=\"color: #007020;\">document<\/span>.getElementById(<span style=\"background-color: #fff0f0;\">'addAnswer'<\/span>)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>5. QuestionBank<\/strong><\/p>\n<p>An array to hold the list of questions.<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/5. questionBank: Declare variable to hold the list of questions<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">var<\/span> questionBank\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>6. addQuestionHandler<\/strong><\/p>\n<p>This is the handler function for the click event of the add button.<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/6. addQuestionHandler(): Create a new question and call addQuestion()<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">function<\/span> addQuestionHandler(){\r\n    vQuestion <span style=\"color: #333333;\">=<\/span> {\r\n        id<span style=\"color: #333333;\">:<\/span>(questionText.value).replace(<span style=\"color: #000000; background-color: #fff0ff;\">\/\\s\/g<\/span>,<span style=\"background-color: #fff0f0;\">''<\/span>),\r\n        q<span style=\"color: #333333;\">:<\/span>questionText.value,\r\n        options<span style=\"color: #333333;\">:<\/span> [opt1.value, opt2.value, opt3.value, opt4.value],\r\n        answer<span style=\"color: #333333;\">:<\/span>answer.value\r\n    }\r\n    addQuestion(vQuestion)\r\n    location.reload()\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>7. addQuestion() function<\/strong><\/p>\n<p>This function does the transaction to add a single question<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/7. addQuestion: Actually perform the insert options<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">function<\/span> addQuestion(question){\r\n    <span style=\"color: #008800; font-weight: bold;\">var<\/span> request <span style=\"color: #333333;\">=<\/span> db\r\n    .transaction([<span style=\"background-color: #fff0f0;\">'questions'<\/span>], <span style=\"background-color: #fff0f0;\">'readwrite'<\/span>)\r\n    .objectStore(<span style=\"background-color: #fff0f0;\">'questions'<\/span>)\r\n    .add(question)\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>8. deleteQuestion() function<\/strong><\/p>\n<p>This function deleted a question using the id<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/8. deleteQuestion: Performs the actual delete operation<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">function<\/span> deleteQuestion(){\r\n    <span style=\"color: #008800; font-weight: bold;\">var<\/span> request <span style=\"color: #333333;\">=<\/span> db\r\n    .transaction([<span style=\"background-color: #fff0f0;\">'questions'<\/span>], <span style=\"background-color: #fff0f0;\">'readwrite'<\/span>)\r\n    .objectStore(<span style=\"background-color: #fff0f0;\">'questions'<\/span>)\r\n    .<span style=\"color: #008800; font-weight: bold;\">delete<\/span>(event.target.id)\r\n    location.reload();\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>9. loadQuestion() function<\/strong><\/p>\n<p>Perform a read operation to retrieve all the questions. Load them onto the UI. Note the delete button, the onclick() attribute and the id attribute.<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #888888;\">\/\/9. loadQuestion(): loads all the question onto the UI<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">function<\/span> loadQuestion(db){        \r\n    <span style=\"color: #008800; font-weight: bold;\">var<\/span> transaction <span style=\"color: #333333;\">=<\/span> db.transaction([<span style=\"background-color: #fff0f0;\">\"questions\"<\/span>]);\r\n    <span style=\"color: #008800; font-weight: bold;\">var<\/span> objectStore <span style=\"color: #333333;\">=<\/span> transaction.objectStore(<span style=\"background-color: #fff0f0;\">\"questions\"<\/span>);\r\n\r\n    objectStore.getAll().onsuccess <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">function<\/span>(event) {\r\n        <span style=\"color: #008800; font-weight: bold;\">var<\/span> str <span style=\"color: #333333;\">=<\/span> <span style=\"background-color: #fff0f0;\">''<\/span>\r\n        event.target.result.forEach(element <span style=\"color: #333333;\">=&gt;<\/span> {\r\n          <span style=\"color: #008800; font-weight: bold;\">var<\/span> btnid <span style=\"color: #333333;\">=<\/span> <span style=\"background-color: #fff0f0;\">\"id = \"<\/span> <span style=\"color: #333333;\">+<\/span> element.id;\r\n          str <span style=\"color: #333333;\">+=<\/span> <span style=\"background-color: #fff0f0;\">'&lt;p class=\"singleQuestion\"&gt;&lt;strong&gt; '<\/span> \r\n          <span style=\"color: #333333;\">+<\/span> element.q <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">'&lt;\/strong&gt; &lt;button '<\/span> \r\n          <span style=\"color: #333333;\">+<\/span> btnid <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">' onclick=\"deleteQuestion()\"&gt;Delete&lt;\/button&gt; &lt;br \/&gt;'<\/span>\r\n          <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">'A. '<\/span> <span style=\"color: #333333;\">+<\/span> element.options[<span style=\"color: #0000dd; font-weight: bold;\">0<\/span>] \r\n          <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">'  B. '<\/span> <span style=\"color: #333333;\">+<\/span> element.options[<span style=\"color: #0000dd; font-weight: bold;\">1<\/span>] \r\n          <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">'  C. '<\/span> <span style=\"color: #333333;\">+<\/span> element.options[<span style=\"color: #0000dd; font-weight: bold;\">2<\/span>] \r\n          <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">'  D. '<\/span> <span style=\"color: #333333;\">+<\/span> element.options[<span style=\"color: #0000dd; font-weight: bold;\">3<\/span>] \r\n          <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">'&lt;\/p&gt;'<\/span>\r\n        });       \r\n        <span style=\"color: #007020;\">document<\/span>.getElementById(<span style=\"background-color: #fff0f0;\">\"questionBox\"<\/span>).innerHTML <span style=\"color: #333333;\">=<\/span> str;\r\n    };\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/drive.google.com\/open?id=1ipCGbmzp6F1xeHUiUHKHVk9dbZpaKaGq\" class=\"broken_link\">Complete Quiz Application<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the previous tutorials, I explained how to build a quiz application. You can review them here. First Quiz App\u00a0 Second Quiz App &#8211; with &hellip; <\/p>\n","protected":false},"author":395,"featured_media":100,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,15],"tags":[16],"class_list":["post-97","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript-tutorials","category-quiz-applications","tag-indexeddb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Build a Quiz App - Store Data in Client-Side IndexedDB - JavaScript Tutorial<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build a Quiz App - Store Data in Client-Side IndexedDB - JavaScript Tutorial\" \/>\n<meta property=\"og:description\" content=\"In the previous tutorials, I explained how to build a quiz application. You can review them here. First Quiz App\u00a0 Second Quiz App &#8211; with &hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/\" \/>\n<meta property=\"og:site_name\" content=\"JavaScript Tutorial\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-02T08:58:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-08-06T06:03:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.kindsonthegenius.com\/javascript\/wp-content\/uploads\/sites\/6\/2020\/04\/Quiz-App-Using-IndexedDB.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"963\" \/>\n\t<meta property=\"og:image:height\" content=\"353\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"kindsonthegenius\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"kindsonthegenius\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/\"},\"author\":{\"name\":\"kindsonthegenius\",\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/#\\\/schema\\\/person\\\/63a68934672db675ff0cd80d066510c2\"},\"headline\":\"Build a Quiz App &#8211; Store Data in Client-Side IndexedDB\",\"datePublished\":\"2020-04-02T08:58:36+00:00\",\"dateModified\":\"2020-08-06T06:03:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/\"},\"wordCount\":482,\"commentCount\":1,\"image\":{\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/wp-content\\\/uploads\\\/sites\\\/6\\\/2020\\\/04\\\/Quiz-App-Using-IndexedDB.jpg\",\"keywords\":[\"IndexedDB\"],\"articleSection\":[\"JavaScript Tutorials\",\"Quiz Applications\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/\",\"url\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/\",\"name\":\"Build a Quiz App - Store Data in Client-Side IndexedDB - JavaScript Tutorial\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/wp-content\\\/uploads\\\/sites\\\/6\\\/2020\\\/04\\\/Quiz-App-Using-IndexedDB.jpg\",\"datePublished\":\"2020-04-02T08:58:36+00:00\",\"dateModified\":\"2020-08-06T06:03:06+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/#\\\/schema\\\/person\\\/63a68934672db675ff0cd80d066510c2\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/wp-content\\\/uploads\\\/sites\\\/6\\\/2020\\\/04\\\/Quiz-App-Using-IndexedDB.jpg\",\"contentUrl\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/wp-content\\\/uploads\\\/sites\\\/6\\\/2020\\\/04\\\/Quiz-App-Using-IndexedDB.jpg\",\"width\":963,\"height\":353,\"caption\":\"Quiz App Using IndexedDB\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/build-a-quiz-app-store-data-in-client-side-indexeddb\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build a Quiz App &#8211; Store Data in Client-Side IndexedDB\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/#website\",\"url\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/\",\"name\":\"JavaScript Tutorial\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/#\\\/schema\\\/person\\\/63a68934672db675ff0cd80d066510c2\",\"name\":\"kindsonthegenius\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3079a7f663b02e801d03cd075852a037af36bd179b5fbcd0603bae3dd7833a9b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3079a7f663b02e801d03cd075852a037af36bd179b5fbcd0603bae3dd7833a9b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3079a7f663b02e801d03cd075852a037af36bd179b5fbcd0603bae3dd7833a9b?s=96&d=mm&r=g\",\"caption\":\"kindsonthegenius\"},\"url\":\"https:\\\/\\\/www.kindsonthegenius.com\\\/javascript\\\/author\\\/kindsonthegenius-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Build a Quiz App - Store Data in Client-Side IndexedDB - JavaScript Tutorial","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/","og_locale":"en_US","og_type":"article","og_title":"Build a Quiz App - Store Data in Client-Side IndexedDB - JavaScript Tutorial","og_description":"In the previous tutorials, I explained how to build a quiz application. You can review them here. First Quiz App\u00a0 Second Quiz App &#8211; with &hellip;","og_url":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/","og_site_name":"JavaScript Tutorial","article_published_time":"2020-04-02T08:58:36+00:00","article_modified_time":"2020-08-06T06:03:06+00:00","og_image":[{"width":963,"height":353,"url":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-content\/uploads\/sites\/6\/2020\/04\/Quiz-App-Using-IndexedDB.jpg","type":"image\/jpeg"}],"author":"kindsonthegenius","twitter_card":"summary_large_image","twitter_misc":{"Written by":"kindsonthegenius","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/#article","isPartOf":{"@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/"},"author":{"name":"kindsonthegenius","@id":"https:\/\/www.kindsonthegenius.com\/javascript\/#\/schema\/person\/63a68934672db675ff0cd80d066510c2"},"headline":"Build a Quiz App &#8211; Store Data in Client-Side IndexedDB","datePublished":"2020-04-02T08:58:36+00:00","dateModified":"2020-08-06T06:03:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/"},"wordCount":482,"commentCount":1,"image":{"@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-content\/uploads\/sites\/6\/2020\/04\/Quiz-App-Using-IndexedDB.jpg","keywords":["IndexedDB"],"articleSection":["JavaScript Tutorials","Quiz Applications"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/","url":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/","name":"Build a Quiz App - Store Data in Client-Side IndexedDB - JavaScript Tutorial","isPartOf":{"@id":"https:\/\/www.kindsonthegenius.com\/javascript\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/#primaryimage"},"image":{"@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-content\/uploads\/sites\/6\/2020\/04\/Quiz-App-Using-IndexedDB.jpg","datePublished":"2020-04-02T08:58:36+00:00","dateModified":"2020-08-06T06:03:06+00:00","author":{"@id":"https:\/\/www.kindsonthegenius.com\/javascript\/#\/schema\/person\/63a68934672db675ff0cd80d066510c2"},"breadcrumb":{"@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/#primaryimage","url":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-content\/uploads\/sites\/6\/2020\/04\/Quiz-App-Using-IndexedDB.jpg","contentUrl":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-content\/uploads\/sites\/6\/2020\/04\/Quiz-App-Using-IndexedDB.jpg","width":963,"height":353,"caption":"Quiz App Using IndexedDB"},{"@type":"BreadcrumbList","@id":"https:\/\/www.kindsonthegenius.com\/javascript\/build-a-quiz-app-store-data-in-client-side-indexeddb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.kindsonthegenius.com\/javascript\/"},{"@type":"ListItem","position":2,"name":"Build a Quiz App &#8211; Store Data in Client-Side IndexedDB"}]},{"@type":"WebSite","@id":"https:\/\/www.kindsonthegenius.com\/javascript\/#website","url":"https:\/\/www.kindsonthegenius.com\/javascript\/","name":"JavaScript Tutorial","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.kindsonthegenius.com\/javascript\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.kindsonthegenius.com\/javascript\/#\/schema\/person\/63a68934672db675ff0cd80d066510c2","name":"kindsonthegenius","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/3079a7f663b02e801d03cd075852a037af36bd179b5fbcd0603bae3dd7833a9b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3079a7f663b02e801d03cd075852a037af36bd179b5fbcd0603bae3dd7833a9b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3079a7f663b02e801d03cd075852a037af36bd179b5fbcd0603bae3dd7833a9b?s=96&d=mm&r=g","caption":"kindsonthegenius"},"url":"https:\/\/www.kindsonthegenius.com\/javascript\/author\/kindsonthegenius-2\/"}]}},"_links":{"self":[{"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/posts\/97","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/users\/395"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/comments?post=97"}],"version-history":[{"count":5,"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/posts\/97\/revisions"}],"predecessor-version":[{"id":116,"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/posts\/97\/revisions\/116"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/media\/100"}],"wp:attachment":[{"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/media?parent=97"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/categories?post=97"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/javascript\/wp-json\/wp\/v2\/tags?post=97"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}