Web Storage とJSON の試作プログラム
Web Storage と JSONを用いた、Webアプリの試作プログラムを作りました。
「学習システム」を念頭に置いた試作プログラム(プロトタイプ)です。
本記事は、記事「Web Storage の試作プログラム」の続き記事になります。
今回の試作プログラムは前回と比べて、データ構造が複雑になっています。
そのため、「学習システム」としてできること(機能)が増えました。
- 今回の試作プログラム: データ構造が複雑、 機能が多い
- 前回の試作プログラム: データ構造が簡単、 機能が少ない
試作プログラムの仕様
仕様
- 学習画面が「初級」と「中級」の2画面ある。
- 「初級」修了者のみ「中級」に進める。
- 学習記録が残る。
- 学習記録は消去できる。
動きの確認
- [Lesson Start]ボタンをクリック
レッスンA ページに移動 - [Lesson A!]ボタンをクリック
レッスンA の得点表示
60点以上だと、[Next Lesson]ボタンが表示 - [Next Lesson]ボタンをクリック
レッスンB ページに移動 - [Lesson B!]ボタンをクリック
レッスンB の得点表示 - ブラウザを閉じる
試作プログラムの終了 - [Lesson Start]ボタンをクリック
試作プログラムの再起動
Lesson A の得点が残っていることを確認 - [Next Lesson]ボタンをクリック
Lesson B の得点が残っていることを確認 - [Remove Lesson Data]ボタンをクリック
Lesson の得点が残っていないことを確認
試作プログラムを作るため、Web Storage とJSON を利用しています。
Web Storage に関しては、記事「Web Storage の試作プログラム」に詳細を記述しました。
Web Storage の詳細は記事「Web Storage の試作プログラム」をご参照ください。
データ構造
JSONを用いて、以下のデータ構造としました。
{ "lessonData456" : [ { "lessonNo":0, "workable":true , "score":0 }, { "lessonNo":1, "workable":false, "score":0 } ]}
Web Storageへの保存
上記データ構造は、以下の形をしています。
{ key : value }
key とvalue は、それぞれ以下となります。
key = "lessonData456" value = [ { "lessonNo":0, "workable":true , "score":0 }, { "lessonNo":1, "workable":false, "score":0 } ]
(注)上記value は、配列(Array)です
Web Storage はデータを、key とvalueのペアとして保存します。
今回は、上式で与えられるkey とvalue をペアとして、Web Storageに保存しました。
各レッスンのデータ構造
[ { "lessonNo":0, "workable":true , "score":0 }, { "lessonNo":1, "workable":false, "score":0 } ]
- lessonNo: 0 が初級、1 が中級
- workable: true が学習可能、false が学習不可能
- score: 得点
試作プログラム
ユーティリティ
Web Storage のアクセス、JSON関連のプログラムです。
- プログラム名: utilWS.js
utilWS.js
const KEY = "lessonData456"; // Web Storage Key var lessonArray; // function createWebStorageData() { // var initialLessonArray = [ {"lessonNo":0, "workable":true , "score":0}, {"lessonNo":1, "workable":false , "score":0} ]; var webStorageData = JSON.stringify(initialLessonArray); //(stringify) localStorage.setItem(KEY, webStorageData); // setItem lessonArray = initialLessonArray; //(object copy) } function readWebStorageData() { // lessonArray <- Web Storage var webStorageData = localStorage.getItem(KEY); // getItem if (!webStorageData) { createWebStorageData(); } else { lessonArray = JSON.parse(webStorageData); //(parse) } } function writeWebStorageData() { // lessonArray -> Web Storage var webStorageData = JSON.stringify(lessonArray); //(stringify) localStorage.setItem(KEY, webStorageData); // setItem } function removeWebStorageData() { // localStorage.removeItem(KEY); // removeItem }
utilWS.js の説明
utilWS.js は、記事「Web Storage の試作プログラム」でのプログラム(Web Storage を操作する各種関数)とほぼ同じです。
説明の詳細は、記事「Web Storage の試作プログラム」をご参照ください。
以下、utilWS.js で新たに加わった部分を説明します。
- 5行目から8行目: initialLessonArray
LessonArray の初期値です - 9行目、24行目: JSON.stringify()
JavaScriptオブジェクトを、JSON形式に変換するメソッドです - 19行目: JSON.parse()
JSON形式のデータを、JavaScriptオブジェクトに変換するメソッドです
初級ページ
2頁ある学習ページの初級ページです。
- プログラム名: A.html
A.html
<!DOCTYPE html> <html> <head> <meta charset="uft-8"> <title>Webstorage based Learning System</title> <script type="text/javascript" src="utilWS.js"></script> <script> const BORDERLINE = 60; // pass: {score >= 60} const LESSON_NO = 0; // Lesson A var output_element; // <output> var input_element; // <input> function pseudoLesson() { var score = Math.floor(Math.random()*101); output_element.innerHTML = "Local Storage: use now"+"<br>"+score; readWebStorageData(); // Array <- Web Storage lessonArray[LESSON_NO].score = score; // judgeVisibility(); // writeWebStorageData(); // Array -> Web Storage } function judgeVisibility() { if (lessonArray[LESSON_NO].score >= BORDERLINE) { input_element.style.visibility = "visible"; lessonArray[LESSON_NO+1].workable = true; } else { input_element.style.visibility = "hidden"; lessonArray[LESSON_NO+1].workable = false; } } function removeLessonData() { removeWebStorageData(); output_element.innerHTML = "Local Storage: not use"; input_element.style.visibility = "hidden"; } window.onload = function() { output_element = document.getElementsByTagName("output")[0]; input_element = document.getElementsByTagName("input" )[1]; // button:[Next Lesson] if (!localStorage) { output_element.innerHTML = "Local Storage can't use." return; } readWebStorageData(); // Array <- Web Storage output_element.innerHTML = "Local Storage: use now"+"<br>"+ lessonArray[LESSON_NO].score; judgeVisibility(); } </script> </head> <body> <input type="button" value="Lesson A!" onclick="pseudoLesson()"> <input type="button" value="Next Lesson" onclick="location.href='B.html'"><br> <input type="button" value="Remove Lesson Data" onclick="removeLessonData()"><br> <output></output> </body> </html>
A.html の説明
<body>要素
入力要素(<input>)が3個、出力要素(<output>)が1個です。
- input0: 「Lesson A!」ボタン
- クリックすると、pseudoLesson() が動く
- input1: 「Next Lesson」ボタン
- クリックすると、B.html に遷移する
- input2: 「Remove Lesson Data」ボタン
- クリックすると、removeLessonData() が動く
- output0: 表示領域
- エラーメッセージと得点を表示する
グローバル変数
- BORDERLINE: 合格点、定数60点
- LESSON_NO: 定数0 、レッスンA、初級
pseudoLesson() 関数
この関数で、レッスンを「疑似的に学習」しています。
以下の順に処理します。
- 得点(score)は、0点から100点までの値を乱数計算
- output要素に、score を表示
- Web StorageからlessonArrayにデータ読込
- lessonArray に score を保存
- judgeVisibiliry() 関数を動作
- lessonArray をWeb Storage に保存
judgeVisibility() 関数
この関数は、[Next Lesson]ボタンの表示/非表示を判断します。
score の値により、処理が分岐します。
- もし、score がBORDERLINE 以上ならば、
- [Next Lesson]ボタンを表示
- 中級ページのworkableを、true に設定
- score がBORDERLINE より下ならば、
- [Next Lesson]ボタンを非表示
- 中級ページのworkableを、false に設定
オンロード
オンロード後、まず、Web Storage が使用可能かどうかを調べます。
その後、以下の処理を順次、実行します。
- Web Storage から、lessonArray を読出し
- output要素に、score を表示
- judgeVisibiliry() 関数を動作
中級ページ
2頁ある学習ページの中級ページです。
- プログラム名: B.html
B.html
<!DOCTYPE html> <html> <head> <meta charset="uft-8"> <title>Webstorage based Learning System</title> <script type="text/javascript" src="utilWS.js"></script> <script> const BORDERLINE = 60; // pass: {score >= 60} const LESSON_NO = 1; // Lesson B var output_element; // <output> var input_element; // <input> function pseudoLesson() { var score = Math.floor(Math.random()*101); output_element.innerHTML = "Local Storage: use now"+"<br>"+score; readWebStorageData(); // Array <- Web Storage lessonArray[LESSON_NO].score = score; // writeWebStorageData(); // Array -> Web Storage } function judgeVisibility() { if (lessonArray[LESSON_NO].workable == true) { input_element.style.visibility = "visible"; } else { input_element.style.visibility = "hidden"; } } window.onload = function() { output_element = document.getElementsByTagName("output")[0]; input_element = document.getElementsByTagName("input" )[0]; // button:[Lesson B!] if (!localStorage) { output_element.innerHTML = "Local Storage can't use." return; } readWebStorageData(); // Array <- Web Storage output_element.innerHTML = "Local Storage: use now"+"<br>"+ lessonArray[LESSON_NO].score; judgeVisibility(); } </script> </head> <body> <input type="button" value="Lesson B!" onclick="pseudoLesson()"> <input type="button" value="Before Lesson" onclick="location.href='A.html'"><br> <output></output> </body> </html>
B.html の説明
<body>要素
入力要素(<input>)が2個、出力要素(<output>)が1個です。
- input0: 「Lesson B!」ボタン
- クリックすると、pseudoLesson() が動く
- input1: 「Before Lesson」ボタン
- クリックすると、A.html に遷移する
- output0: 表示領域
- エラーメッセージと得点を表示する
グローバル変数
- BORDERLINE: 合格点、定数60点
- LESSON_NO: 定数1 、レッスンB、中級
pseudoLesson() 関数
この関数で、レッスンを「疑似的に学習」しています。
以下の順に処理します。
- 得点(score)は、0点から100点までの値を乱数計算
- output要素に、score を表示
- Web StorageからlessonArrayにデータ読込
- lessonArray に score を保存
- lessonArray をWeb Storage に保存
judgeVisibility() 関数
この関数は、[Lesson B!]ボタンの表示/非表示を判断します。
Lesson B の workable の値により、処理が分岐します。
- もし、workable が true ならば、
- [Lesson B!]ボタンを表示
- workable が false ならば、
- [Lesson B!]ボタンを非表示
オンロード
オンロード後、まず、Web Storage が使用可能かどうかを調べます。
その後、以下の処理を順次、実行します。
- Web Storage から、lessonArray を読出し
- output要素に、score を表示
- judgeVisibiliry() 関数を動作