Local Storage
演習6-1
演習6-1
演習5-3のスクリプトを次のように変更せよ.
- ロードボタンとセーブボタンをつけ,セーブボタンをクリックしたら,その時描かれている矩形の情報を(x, y, w, h)をローカルストレージにセーブし,ロードボタンをクリックしたら,セーブされている矩形の情報をロードして表示する.
解答例
解答例
ソース
ソース
- <!DOCTYPE html>
- <html>
- <head>
- <style>
- canvas {
- border: solid 1px #000066;
- }
- </style>
- <meta charset="utf-8" />
- <title>Canvas マウスで正方形を描画</title>
- <script type="text/javascript">
- "use strict";
- window.addEventListener("load", function () {
- var
- canvas, context,// カンバスとコンテクスト
- x1, y1, // 描画領域中のマウスの位置(mousedown)
- x2, y2, // 描画領域中のマウスの位置(mouseup)
- draw_flag, // 描画中か否か(ドラッグ中か否か)
- loadButton, saveButton;
- canvas = document.getElementById("canvas1");
- context = canvas.getContext("2d");
- draw_flag = false;
- // マウスダウンの処理
- canvas.addEventListener("mousedown", function (e) {
- var bcr;
- console.log("mousedown start");
- // ドラッグ中
- draw_flag = true;
- // イベントのターゲット(キャンバス)の座標を取得
- bcr = e.target.getBoundingClientRect();
- // マウスダウンの座標を記憶
- x1 = x2 = e.clientX - bcr.left;
- y1 = y2 = e.clientY - bcr.top;
- console.log("mousedown end", x1, y1);
- }, false);
- // マウスアップの処理
- canvas.addEventListener("mouseup", function (e) {
- console.log("mouseup start");
- var bcr;
- // ドラッグ中でなければ何もしない.
- if (draw_flag === false) {
- return;
- }
- // イベントのターゲット(キャンバス)の座標を取得
- bcr = e.target.getBoundingClientRect();
- // マウスアップの座標
- x2 = e.clientX - bcr.left;
- y2 = e.clientY - bcr.top;
- // 矩形を描画
- context.clearRect(0, 0, bcr.right, bcr.bottom);
- context.strokeStyle = "#000000";
- context.beginPath();
- context.strokeRect(x1, y1, x2 - x1, y2 - y1);
- // ドラッグ中ではない
- draw_flag = false;
- console.log("mouseup end", x2, y2);
- }, false);
- loadButton = document.getElementById("loadbutton");
- loadButton.addEventListener('click', function () {
- var x, y, w, h;
- console.log("loadfile start");
- x = localStorage.getItem("t-tanaka-x");
- y = localStorage.getItem("t-tanaka-y");
- w = localStorage.getItem("t-tanaka-w");
- h = localStorage.getItem("t-tanaka-h");
- context.clearRect(0, 0, canvas.width, canvas.height);
- context.strokeStyle = "#000000";
- context.beginPath();
- context.strokeRect(x, y, w, h);
- console.log("loadfile end", x, y, w, h);
- });
- saveButton = document.getElementById("savebutton");
- saveButton.addEventListener('click', function () {
- console.log("save start");
- localStorage.setItem("t-tanaka-x", x1);
- localStorage.setItem("t-tanaka-y", y1);
- localStorage.setItem("t-tanaka-w", x2 - x1);
- localStorage.setItem("t-tanaka-h", y2 - y1);
- console.log("save end", x1, y1, x2 - x1, y2 - y1);
- });
- });
- </script>
- </head>
- <body>
- <canvas id="canvas1" width="300" height="200"></canvas>
- <p><button id = "loadbutton" >ロード</button>
- <button id = "savebutton">セーブ</button></p>
- </body>
- </html>
解説
解説
- 63行目から76行目
- 「ロード」ボタンがクリックされたら,ローカルストレージからデータをロードするため,ロードボタンにクリックイベントリスナーを追加
- 67行目から70行目
- localStorage.getItemメソッドでデータをロード.
- localStorateは組み込みのグローバル変数,getItemはそのメソッド.引数でデータの名前を指定してデータを取得する.
- 78行目から87行目
- 「セーブ」ボタンがクリックされたら,ローカルストレージにデータをセーブするため,セーブボタンにクリックイ弁をリスナーを追加
- 81行目から84行目
- localStorate.setItemメソッドでデータをセーブ.
- setItemはlocalStorageのメソッド.第1引数で指定した名前で,第2引数でデータをセーブする.
- 29行目,37行目,42行目,60行目,66行目,75行目,80行目,85行目
- デバッグしやすいように,各関数の開始時と終了時にconsole.logでブラウザのコンソールにログを出力している.
演習6-2
演習6-2
演習6-1のスクリプトを次のように変更せよ.
- ロードしたときと,マウスアップのときに同じ描画処理をするので,描画の関数drawを定義し前記箇所で呼び出すようにする.
- HTMLを表示したときはセーブボタンをdisableとし(クリックできないようにし),マウスアップのイベントのあとdisableを解除する.
- ボタン要素にdisable属性をつけるとdisableになる.
- <button id = "savebutton" disabled>セーブ</button>
- disable属性を削除するには,removeAttribute("disabled")を用いる.
- ボタン要素にdisable属性をつけるとdisableになる.
解答例
解答例
ソース
ソース
- <!DOCTYPE html>
- <html>
- <head>
- <style>
- canvas {
- border: solid 1px #000066;
- }
- </style>
- <meta charset="utf-8" />
- <title>Canvas マウスで正方形を描画</title>
- <script type="text/javascript">
- "use strict";
- window.addEventListener("load", function () {
- var
- canvas, context,// カンバスとコンテクスト
- x1, y1, // 描画領域中のマウスの位置(mousedown)
- x2, y2, // 描画領域中のマウスの位置(mouseup)
- draw_flag, // 描画中か否か(ドラッグ中か否か)
- loadButton, saveButton;
- function draw(x, y, w, h) {
- console.log("draw start");
- context.clearRect(0, 0, canvas.width, canvas.height);
- context.strokeStyle = "#000000";
- context.beginPath();
- context.strokeRect(x, y, w, h);
- console.log("draw end", x, y, w, h);
- }
- canvas = document.getElementById("canvas1");
- context = canvas.getContext("2d");
- draw_flag = false;
- // マウスダウンの処理
- canvas.addEventListener("mousedown", function (e) {
- var bcr;
- console.log("mousedown start");
- // ドラッグ中
- draw_flag = true;
- // イベントのターゲット(キャンバス)の座標を取得
- bcr = e.target.getBoundingClientRect();
- // マウスダウンの座標を記憶
- x1 = x2 = e.clientX - bcr.left;
- y1 = y2 = e.clientY - bcr.top;
- console.log("mousedown end", x1, y1);
- }, false);
- // マウスアップの処理
- canvas.addEventListener("mouseup", function (e) {
- console.log("mouseup start");
- var bcr;
- // ドラッグ中でなければ何もしない.
- if (draw_flag === false) {
- return;
- }
- // イベントのターゲット(キャンバス)の座標を取得
- bcr = e.target.getBoundingClientRect();
- // マウスアップの座標
- x2 = e.clientX - bcr.left;
- y2 = e.clientY - bcr.top;
- // 矩形を描画
- draw(x1, y1, x2 - x1, y2 - y1);
- // ドラッグ中ではない
- draw_flag = false;
- saveButton.removeAttribute("disabled");
- console.log("mouseup end", x2, y2);
- }, false);
- loadButton = document.getElementById("loadbutton");
- loadButton.addEventListener('click', function () {
- var x, y, w, h;
- console.log("loadfile start");
- x = localStorage.getItem("t-tanaka-x");
- y = localStorage.getItem("t-tanaka-y");
- w = localStorage.getItem("t-tanaka-w");
- h = localStorage.getItem("t-tanaka-h");
- draw(x, y, w, h);
- console.log("loadfile end", x, y, w, h);
- });
- saveButton = document.getElementById("savebutton");
- saveButton.addEventListener('click', function () {
- console.log("save start");
- localStorage.setItem("t-tanaka-x", x1);
- localStorage.setItem("t-tanaka-y", y1);
- localStorage.setItem("t-tanaka-w", x2 - x1);
- localStorage.setItem("t-tanaka-h", y2 - y1);
- console.log("save end", x1, y1, x2 - x1, y2 - y1);
- });
- });
- </script>
- </head>
- <body>
- <canvas id="canvas1" width="300" height="200"></canvas>
- <p><button id = "loadbutton" >ロード</button>
- <button id = "savebutton" disabled>セーブ</button></p>
- </body>
- </html>
解説
解説
- 演習6-1の54行目から57行目と71行目から74行目の処理をdrawという関数にまとめ(22行目から29行目),呼び出している(63行目,78行目).
- 66行目
- disable属性の削除
- 99行目
- disable属性を追加
演習6-3
演習6-3
演習6-2のスクリプトを次のように変更せよ.
- x, y, w, hを個別にセーブする代わりにx, y, w, hの4つのプロパティもつオブジェクトをセーブするようにする.
- オブジェクトをセーブするにはJSON(JavaScript Object Notation)文字列に変換するのが便利.
- localStorage.setItem(“オブジェクト”, JSON.stringify(obj))でobjを文字列に変換して”オブジェクト”という名前でローカルストレージにセーブする.
- JSON.stringify(obj)でオブジェクトobjが文字列に変換される.
- 逆にJSON.parse(obj_str)で文字列obj_strがJavascriptのオブジェクトに変換される.
- obj = JSON.parse(localStorage.getItem(“オブジェクト”))でオブジェクトという名前でセーブされているJSON文字列を取り出し,Javascriptオブジェクトに変換してobjに代入する.
- drawの引数もx, y, w, hの代わりに,x, y, w, hの4つのプロパティをもつオブジェクトとする.
解答例
解答例
ソース
ソース
- <!DOCTYPE html>
- <html>
- <head>
- <style>
- canvas {
- border: solid 1px #000066;
- }
- </style>
- <meta charset="utf-8" />
- <title>Canvas マウスで正方形を描画</title>
- <script type="text/javascript">
- "use strict";
- window.addEventListener("load", function () {
- var
- canvas, context,// カンバスとコンテクスト
- draw_flag, // 描画中か否か(ドラッグ中か否か)
- loadButton, saveButton,
- rect; // セーブするオブジェクト(x, y, w, h)
- function draw(rect) {
- console.log("draw start");
- context.clearRect(0, 0, canvas.width, canvas.height);
- context.strokeStyle = "#000000";
- context.beginPath();
- context.strokeRect(rect.x, rect.y, rect.w, rect.h);
- console.log("draw end", rect);
- }
- rect = {};
- canvas = document.getElementById("canvas1");
- context = canvas.getContext("2d");
- draw_flag = false;
- // マウスダウンの処理
- canvas.addEventListener("mousedown", function (e) {
- var bcr;
- console.log("mousedown start");
- // ドラッグ中
- draw_flag = true;
- // イベントのターゲット(キャンバス)の座標を取得
- bcr = e.target.getBoundingClientRect();
- // マウスダウンの座標を記憶
- rect.x = e.clientX - bcr.left;
- rect.y = e.clientY - bcr.top;
- rect.w = rect.h = 0;
- console.log("mousedown end", rect);
- }, false);
- // マウスアップの処理
- canvas.addEventListener("mouseup", function (e) {
- console.log("mouseup start");
- var bcr;
- // ドラッグ中でなければ何もしない.
- if (draw_flag === false) {
- return;
- }
- // イベントのターゲット(キャンバス)の座標を取得
- bcr = e.target.getBoundingClientRect();
- // マウスアップの座標
- rect.w = e.clientX - bcr.left - rect.x;
- rect.h = e.clientY - bcr.top - rect.y;
- // 矩形を描画
- draw(rect);
- // ドラッグ中ではない
- draw_flag = false;
- saveButton.removeAttribute("disabled");
- console.log("mouseup end", rect);
- }, false);
- loadButton = document.getElementById("loadbutton");
- loadButton.addEventListener('click', function () {
- console.log("loadfile start");
- rect = JSON.parse(localStorage.getItem("t-tanaka-rect"));
- draw(rect);
- console.log("loadfile end", rect);
- });
- saveButton = document.getElementById("savebutton");
- saveButton.addEventListener('click', function () {
- console.log("save start");
- localStorage.setItem("t-tanaka-rect", JSON.stringify(rect));
- console.log("save end", rect);
- });
- });
- </script>
- </head>
- <body>
- <canvas id="canvas1" width="300" height="200"></canvas>
- <p><button id = "loadbutton" >ロード</button>
- <button id = "savebutton" disabled>セーブ</button></p>
- </body>
- </html>
解説
解説
- 21行目
- drawの引数をx,y,w,hのかわりにそれら4つの値をプロパティとしてもつオブジェクトrectとする.
- 30行目,44行目から46行目,61行目から62行目
- x,y,w,hの4つのプロパティをもつrectというオブジェクトを導入し,マウスダウン,マウスアップの度に値を設定.
- 74行目
- JSON.parseで,JSON形式の文字列をオブジェクトに変換
- 82行目
- JSON.stringifyで,オブジェクトをJSON文字列に変換
参考
参考