Step 3までで計算機のWebアプリケーションとしては完成ですが、
せっかくなので値を保存するようにしてみましょう。
Step 3までのプログラムだと、再読込した際に計算結果が消え、
前回の計算結果を見ることはできません。
input要素の値は残っていますが、これはブラウザのキャッシュによるものであり、
いつまでも残っているという保証はありません。
実際、多くのブラウザでは Ctrl キーを押しながら F5 キーで再読込すれば、
キャッシュを無視して読込みするため、これら値の表示は消えます。
そこでここでは、LocalStorage にデータを保存するようにしてみます。
LocalStorage
LocalStorage は「ローカルストレージ」と読みます。
これは値をブラウザの中に保存することができるもので、
簡単なアプリケーションだととても便利に使えます。
LocalStorage への保存は以下のようにできます。
localStorage.setItem("キー", 保存したいもの);
ここでキーは任意の文字列です。変数名のようなものだと思っておけば良いでしょう。
ちなみに、保存できるデータは「文字列」のみとなっていますが、
配列などもJSON形式にすることで保存できるようになります。
JSON形式は文字列でデータを表す形式で、
JSON.stringify(配列や変数);
のようにすれば、配列や変数の値をJSON形式にでき、
JSON.parse(JSON形式のもの);
とすれば、JSON形式のデータを元のデータに戻せます。
また、LocalStorage からのデータの読みだしは以下のようにできます。
localStorage.getItem("キー");
関数の定義
まずは、保存と読みだしの関数を用意しましょう。
関数の定義は
function 関数名(引数1, 引数2, ...) {
処理
}
のようにします。
C言語と違って、引数の型を指定する必要はありません。
よって、保存と読みだしの関数はそれぞれ以下のようになります。
function save() {
localStorage.setItem("Sample", JSON.stringify([a,b,c]));
}
function load() {
var x = JSON.parse(localStorage.getItem("Sample"));
a = x[0];
b = x[1];
c = x[2];
$("#num1").val(a);
$("#num2").val(b);
$("#hyouji").html(c);
}
ついでに、今はユーザが入力した数値を入れている a と b、計算結果の c は
クリック処理の部分でしか参照できないので、
プログラムの上の方で定義するように変更しておきましょう。
$(function () {
var a, b, c;
function save() {
localStorage.setItem("Sample", JSON.stringify([a,b,c]));
}
function load() {
var x = JSON.parse(localStorage.getItem("Sample"));
a = x[0];
b = x[1];
c = x[2];
}
$('.calbutton').click(function() {
a = +($("#num1").val());
b = +($("#num2").val());
switch($(this).attr("id")) {
case "plus":
c = a + b;
break;
case "minus":
c = a - b;
break;
case "multi":
c = a * b;
break;
case "divs":
c = a / b;
break;
}
$("#hyouji").html(c);
});
});
変数 a, b, c はsaveやloadの関数の中で参照できるので、引数は不要です。
これだけだと保存と読みだしの動作を定義しただけなので、
実際に保存や読みだしをする箇所でこれらの関数を呼びましょう。
まず、保存は計算結果を表示するタイミングで良いはずです。
読みだしはページを表示したときなので、プログラムの下の方でloadを呼べば良い
(関数定義もクリック処理の定義も、定義であってそれ単体では何もしません)ですが、
初めてアクセスした人は保存したデータがないので、それを考慮する必要があります。
特に JSON.parse() はパースするデータがないとエラーになってしまいます。
localStorage.getItem("foo")
の結果は、"foo" のキーで保存したデータが無ければ null が返ります。
JavaScriptでは、false、0、null などは「偽」として扱われ、偽以外のものは「真」
になります。よって、
if (localStorage.getItem("Sample")) {
処理
}
のようにすれば、データが LocalStorage にあるときだけ処理ができます。
$(function () {
var a, b, c;
function save() {
localStorage.setItem("Sample", JSON.stringify([a,b,c]));
}
function load() {
var x = JSON.parse(localStorage.getItem("Sample"));
a = x[0];
b = x[1];
c = x[2];
$("#num1").val(a);
$("#num2").val(b);
$("#hyouji").html(c);
}
$('.calbutton').click(function() {
a = +($("#num1").val());
b = +($("#num2").val());
switch($(this).attr("id")) {
case "plus":
c = a + b;
break;
case "minus":
c = a - b;
break;
case "multi":
c = a * b;
break;
case "divs":
c = a / b;
break;
}
$("#hyouji").html(c);
save();
});
if(localStorage.getItem("Sample")) {
load();
}
});