2014年9月12日金曜日

window.onloadで表示された直後に指定の関数を実行しよう

window.onloadはHTMLにJavaScriptを書いた時、一番最初に必ず読み込まれてほしい関数の処理を実行する時に利用します。HTML内でJavaScriptを記述すると、タグ内に追加したonclick等で関数を実行させない限り関数が実行されないので、フォームの表示後の即時実行ではwindow.onload(イベント)を利用します。実際の書き方を見てみると、

window.onload = 関数名

もしくは、

window.onload = function(){
//ここに処理を書く
};

このどちらかの形式をとります。前者の使い方は

<script>
window.onload = init;

function init(){
    alert("hello world!");
}
</script>

このように書いたコードを実行すると、読み込まれた直後にinit関数が読み込まれ、hello world!が表示されます。


もう一つの

<script>
window.onload = function(){
    alert("hello world!");
};
</script>

window.onloadで関数名を指定せず、function()から書き始める方法もあります。このように関数名のところに直接functionから書くものを無名関数と呼びます。無名関数であっても関数なので、function内に処理を書くことで、一つ前のinit関数を作成してwindow.onloadでinit関数を指定するものと同じ結果になります。実際、このコードを実行してみると同様の結果になります。

2014年9月9日火曜日

フォームに入れた値が文字列でないかを調べよう

フォームに入れた値が文字列だった場合、計算を始める前に警告を表示したいということがあります。前回まで作成してきたcalculate関数に入力内容のチェックを入れてみます。

function calculate(){
    var form1 = document.querySelector("#form1");
    var num1 = form1.value;

    if (typeof num1 == "number") {
        //処理を続ける
    } else {
        window.alert("form1に入れた値は数字ではありません");
    }

    //以下省略
}

このように変数の型を調べて、その結果からif文で数字出なかった場合は警告を出すということができますが、ここで一つ問題なのは、document.querySelector()のvalueで取得した値は数字を入力していても文字列として返ってくるという点で、typeof numで型を調べると、string(文字列)として認識されてしまいます。。何とかフォームに入力した値が数字であると確認するために、文字列をparseIntしてから調べるという手段があります

num1 = parseInt(num1);で値を整数に変換する際、元の変数の値が数字以外だった場合、NaN(数字ではない)という値で返っています。この状態でisNaN関数を使って、変数が数字でないかを調べることができます。 isNan関数は変数の値が数字ではないときにtrue(真)を返すので、

function calculate(){
    var form1 = document.querySelector("#form1");
    var num1 = form1.value;

    //変数に入れた値を数字に変換する
    num1 = parseInt(num1);

    //文字列をparseIntすると値がNaNになるため、isNaN(変数)で変数の値を調べるとtrueが帰ってくる
    if (isNaN(num1) == true) {
        window.alert(“form1に入力した値は数字ではありません”);
    } else {
        //処理を続ける
    }

    //以下省略
}

ということで、フォームに入力した値を調べることができ、より確実に処理を進めることが可能となります。

計算機で足し算以外の演算を追加しよう


足し算の箇所をプルダウン形式(選択肢がいくつかあるフォーム)で足し算の他に引き算、掛け算と割り算の選択をできるようにします。プルダウン形式も今までのフォームと同様にHTMLで追加しますが、<input type="***">の形式では対応できません。そこで<select>を利用します。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>フォーム</title>
<script>
//計算するための関数
function calculate(){
    //省略
}
</script>
</head>
<body>

<input type="number" value="" id="form1">

<select id="operator">
    <option>+</option>
    <option>-</option>
    <option>×</option>
    <option>÷</option>
</select>

<input type="number" value="" id="form2">
=
<input type="number" id="result">
<input type="button" value="計算する" onclick="calculate();">

</body>
</html>

計算方法のプルダウン形式(セレクトボックス)が追加できたら、次は関数内の処理を見ていきます。

function calculate(){
    var form1 = document.querySelector("#form1");
    var num1 = form1.value;

    var form2 = document.querySelector("#form2");
    var num2 = form2.value;

    //計算結果を入れる変数を用意する
    var addition;

    var operator = document.write("#operator");
    //<select>でも選択した値は.valueで取得します。
    var op = operator.value;
 
    //選択した項目のoptionの文字列によって計算方法を変える
    if (op == "+") {
        addition = num1 + num2;
    } else if (op == "-") {
        addition = num1 - num2;
    } else if (op == "×") {
        addition = num1 * num2;
    } else {
        addition = num1 / num2;
    }

    //計算結果表示用のフォーム
    var resultForm = document.querySelector("#result");
    resultForm.value = addition;
}

あとは計算結果をresultFormのvalueに放り込めば処理は終了です。

HTMLのフォームにJavaScriptで処理を追加して計算機を作ろう2

前回、フォームからcalculate関数を実行できるようにコードを追加して、計算結果をフォームに渡して表示するというところまで記載しました。作成したコードを実行して、数字を入力して計算してみると、


7 + 4を行ったはずなのに、結果が74になりました。これは各フォームに入力した値が数字であっても、変数に入れた時に文字列として判断されたため、7という文字と4という文字を足したものが返ってきたことになります。この症状を回避するために、フォームから取得した値を文字列に変換しなければなりません。

<script>
var form1 = document.querySelector("#form1");
var num1 = form1.value;
//文字列を数字に変換して、再度変数に入れなおす
num1 = parseInt(num1);

var form2 = document.querySelector("#form2");
var num2 = form2.value;

//文字列を数字に変換して、再度変数に入れなおす
num2 = parseInt(num2);

//計算結果を入れる変数を用意する
var addition;
addition = num1 + num2;

//計算結果表示用のフォーム
var resultForm = document.querySelector("#result");
resultForm.value = addition;
</script>

parseIntは変数の中に入っている文字列の値を数字に変換する関数で、計算を行う前に各値を数字にする必要があります。この処理を行った上で再度表示を行ってみると、


7 + 4 = 11で、期待する値が結果のフォームに表示されました。今回の処理から変数の中に入っている値がどのような型(文字列か数字か)を意識してプログラミングを書く必要があるということが分かりました。

2014年9月8日月曜日

HTMLのフォームにJavaScriptで処理を追加して計算機を作ろう1

前回作成したフォームにJavaScriptのコードで処理を追加するために関数を用意します。HTMLにJavaScriptを書いて実行するためには<head>か<body>で囲まれた箇所に<script>で囲んでコードを書きます。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>フォーム</title>
<script>
//ここにJavaScriptのコードを書く
</script>
</head>
<body>
<script>
//ここにもJavaScriptのコードを書ける
</script>
</body>
</html>

前回作成したフォームを元に最初に関数を用意してみましょう。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>フォーム</title>
<script>
//計算するための関数
function calculate(){

}
</script>
</head>
<body>

<input type="number" value="">
+
<input type="number" value="">
=
<input type="number">
<input type="button" value="計算する">

</body>
</html>

この関数をHTMLで作成したボタンで実行するためには、ボタンにイベントを追加します。

<input type="button" value="計算する" onclick="calculate();">

ボタンのHTMLコードにonclick="関数名"を追加し、ボタンを押すことで指定した関数は実行されます。それでは、事前に用意した各フォームから入力した値を取り出して計算する関数を書いてみます。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>フォーム</title>
<script>
//計算するための関数
function calculate(){

}
</script>
</head>
<body>

<input type="number" value="" id="form1">
+
<input type="number" value="" id="form2">
=
<input type="number" id="result">
<input type="button" value="計算する" onclick="calculate();">

</body>
</html>

ボタンを押したときに各フォームからそれぞれ値を取り出したいので、各フォームの識別のために<input type="number">にid(フォームの名前)を追加しておきます。id名は自由です。idを振り分けたフォームをJavaScriptの関数内で取得するために、document.querySelector()という予め用意されている関数を利用します。querySelector()の引数に#を付けたid名を入れます。

var form1 = document.querySelector("#form1");
var form2 = document.querySelector("#form2");

取得したform1をwindow.alert(form1);で値を見ても、[object HTMLInputElement]を表示されて、入力した値を取得できません。(window.alert()はポップアップで値を表示してくれるので、開発時の値の確認では便利です。) document.querySelectorでは表示されているフォーム全体を取得しているので、フォームの中のどの要素の値がほしいかを指定しなければなりません。入力した値は<input type="number" value="">のvalueに入っているので、

var num1 = form1.value;と、フォームそのものを入れた変数の後に.(ドット)valueをつなげて値を取得します。
var form1 = document.querySelector("#form1");
var num1 = form1.value;
window.alert(num1);

num1の値を確認すると、入力した値が入っていることが分かります。それでは用意したcalculate関数の中でformから値を取得して、計算をしてみましょう。
<script>
function calculate(){
    var form1 = document.querySelector("#form1");
    var num1 = form1.value;

    var form2 = document.querySelector("#form2");
    var num2 = form2.value;

    //計算結果を入れる変数を用意する
    var addition;
    addition = num1 + num2;

    //計算結果表示用のフォーム
    var resultForm = document.querySelector("#result");
    resultForm.value = addition;
}
</script>

計算結果もフォームに入れたいので、resultForm = document.querySelector("#result");でフォームを取得しておいて、valueに値を入れます。入れる時、他のフォームで値を取得した方法と逆で、resultForm.value = addition;とすることでフォームに値を入れて表示させることができます。

このコードを実行すると意図しない問題が発生しますが、それは次回に説明します。

2014年9月7日日曜日

HTMLでフォームの作成3 フォームに値を入れる

表示したフォームに値を入れてみます。下記のコードを書いてみましょう。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>フォーム</title>
</head>
<body>

<input type="number" value="5">
+
<input type="number" value="8">
=
<input type="number">
<input type="button" value="計算する">

</body>
</html>

このコードを実行(表示)してみると、


valueに入れた値がフォームに表示されています。typeがbuttonの場合、valueに入れた文字列がボタンに表示されています。

HTMLでフォームの作成2 使用できるフォームの種類

前回、HTMLの<input type="number">で数字を入力するフォームが表示されました。フォームですが、inputの横にあるtype="number"のnumberを変えると、数字を入力するフォーム以外にも様々なフォームが表示され、<input type="***">のtypeで指定できるフォームの型は下記の通りです。buttonとsubmitのボタンに表示する文字は<input type="button" value="button">、<input type="submit" value="submit">のようにvalue="***"で指定しています。
(使用しているブラウザによって、使用できないtypeがあります。Google Chromeをベースに記載しています)



これらのフォームを組み合わせて、アプリをデザインしていきましょう。