■ このページについて
 このページは,Javascriptを用いたインタラクティブなホームページ型教材を作成しようと考えておられる方への参考として,作者が学んできたことの要点を記述するものです.作者自身,教育工学もJavascriptも専門ではなく,充分勉強する時間もないため,内容的に物足りないと思います.これらについてさらに深く学びたい方は,その種のホームページや参考書をお読みください.
 また,ホームページとして公開するには,十分調べて正確に記述すべきですが,時間的余裕も能力もありません.そこでこのページは,「アサオの言いたい放題」「アサオ節全開」というスタイルで,初心者に分かりやすいことだけを目指して多少の正確さを犠牲にして書きます.
 教育目的に絞れば,Javascriptの全部をマスターする必要はなく,限られた構文でほとんどの目的を達成することができます.むしろほとんどの技術は,使わないと言った方が実態に合うと思います.(まずフレームは使いません−−印刷に対応せず,画面も狭くなり,集中力の不足する生徒に外の景色を見せているようなことになるからです.ステイタスバーに文字を表示したり,画面の色を変えたり,音を出したりするのも必要とは言えないでしょう.・・・)大事なのは,応答することです.
 視聴覚機器,特にコンピュータを用いた教育の考え方については,「教育工学」関係の図書をお読みください.
 比喩的に言えば,教育工学の手法は,□□ハンバーガー,□□ドーナツのような外食産業において,一定水準以上のサービスを多数者に提供するための技術と似ています.これに対して,家庭教師や個人指導の手法は,和風料理店において,なじみの客の好みに応じた料理を提供するノウハウと似ています(非常に高価な料理です.).
■ HTMLによる応答形ホームページ
 次の図は,生徒が(先生の代わりに)パソコンから情報を取り入れている様子を図示したものです.インターネットを利用した情報収集においては、図の(1)のみで学習が成り立ちます.また,シミュレーション(コンピュータ模擬実験)のような場合にも図の(1)に示した一方向の情報伝達のみで学習が成り立ちます.
 これに対して,数学の問題練習などにおいては,「(1)問題の提示,(2)生徒の応答,(3)それが正しいか間違っているかを知らせる」というインタラクティブな構成になっていれば,生徒が各自のペースで学習できます.
 ホームページでこの条件を満たすためには,生徒の解答(2)−−入力は,マウスやキーボードから行われるのが普通−−が正しいか間違っているかに応じて「分岐する」ことが最低条件となります.分岐をHTMLのリンクだけで実現するには,次のような形が考えられます.
(ただし,ア にはanswer1-1.htmへの,イ にはanswer1-2.htmへのリンクがかけられているものとします.)

-----question1.htm------------------------------

(1) 問題:「現在の日本の首都はどこですか.」

   ア 京都      イ 東京

-----answer1-1.htm------------------------------

住めば都といっても,首都とは 
いえないのではないでしょうか.

-----answer1-2.htm------------------------------

   正解です.

-----------------------------------------------

 技術的な注意事項としては,次のようなものが考えられます.
  1. 問題と答のファイル数がかなり多くなるのが難点です.作成する側も大変ですが,読む側も全体構造が分かりにくくなります.
  2. 学校の授業で使うときは,「1時間目にある生徒が使ったパソコンを2時間目に他の生徒が使うような場合」が普通です.この場合,訪れたリンク(Visited Link)と通常のリンクとが色分けされる通常の設定では,上のアのように,解答が(誤答ともいう?)見えてしまいます.これらの色を同一にしておかないと使いにくいものになります.
  3. リンクのかかっている文字や図の上にマウスを移動させると,リンク先のファイル名がステイタスバー(画面下の帯)に表示されることは,ゲーム好きの生徒ならすぐに気づきます.だから,ファイル名をgotou1.htm,seitou1.htmなどと結果が分かるような名前にすると,抜け道探しの方に気が行ってしまい,学習効果半減です.
 グラフィック機能を用いたシミュレーション型教材を作るには,Javaが適していると言われています.
 JavascriptはJavaとは全く別のものです.Javascriptは,ブラウザをインタプリタとして利用するものなので,HTMLで作成したものに少しばかり書き加えるだけで容易に利用できます.またプログラムの中身(ソース)は公開されますので,気に入ったホームページの作成方法からヒントを得ることができます−−著作権上保護されるのは「表現」です.工業の分野で登録によって保護される特許権や実用新案権と異なり,そこに用いられている「アイデア」は,保護の対象ではありません.そこで,Javascriptで作られたホームページからは,プログラミング上のアイデアを,お互いに学びながら向上していける利点があります.
 

 (1)と(3)は,いずれも教える側から学ぶ側に向けて出される情報ですが,その区別はどこにあるでしょうか? (3)は(2)よりも後にあるのです.(ジョークをいっているのではありません:学習する側が答えた内容(2)に対して,それが合っているか間違っているか,間違っている場合のヒントを示してさらなる回答を求めるかなど,(3)は学習する側の行動に対して評価を与えるものです.)
 

 ホームページとするファイルはファイル名.htmまたはファイル名.htmlという形で,ドット(ピリオド)の後ろにhtmまたはhtmlを付けます.
 従来,ホームページという用語は,ホームの(入り口の)ページという意味で用いられていましたが,HTMLで書かれたページの各々もホームページという用語で表わすことも多くなってきました.その場合,自分の作成したページの中で入り口とするページをトップページ,メインページ,フロントページなどと呼んでいるようです.
 フロントページは,index.htmと名付けることが多いようです.サーバを管理しているプロバイダ側の約束事として,ユーザに割り当てられたディレクトリ(私の場合は,http://www.geisya.or.jp/~mwm48961/)だけを指定した場合,index.html>INDEX.HTML>index.htm>INDEX.HTMなどの順に優先順位を決めて,該当ファイルがあれば出すようになっています(main.htmを優先する設定の所もあるようです).ところが,このうち一つも該当するファイルがないときには,「ディレクトリ内にあるファイルのリストを出す(=ディレクトリサーチを許可する)」か「ファイル名も分からないままに,中身を探りに来るのは怪しいので,お断りにする」のいずれかとなります.ディレクトリサーチを許可するサーバでは,家財道具一式(あばら骨のように)見えてしまいます.また,ロボット系のサーチエンジンでは,index.htmやindex.htmlから芋づる式に捜すようです.いろんな事情を総合すると,メインとなるメニューページはindex.htmまたはindex.htmlにするのが無難なようです.

■ Javascriptを用いた応答形ホームページ
 Javascriptを用いれば,正答,誤答に応じたメッセージを簡単に出すことができます.選択肢「ア 京都,イ 東京」のいずれをクリックしたかに応じて出すべき図を差し替えます.(すでに表示されている画面の一部を変化させる場合,図を入れ替える方が文字を入れ替えるよりも簡単です.)
 次の例では,選択肢「ア 京都,イ 東京」からJavascript疑似プロトコル(リンクの形式を借りて関数を呼び出す仕組みのようなもの)を用いて採点関数に数値を渡し,採点関数は渡された数値に応じて,white.gifというメッセージ用の図(白紙)をyes.gif,no.gifのいずれかに差し替えます.
<例1>
//以下をヘッダ部分に記述します.
<script language="javascript">
function saiten(anum)
{if(anum == 1)
  document.kekka1.src = "no.gif";
else if(anum == 2)
 document.kekka1.src = "yes.gif";
}
</script>

//以下はボディ部分に記述します.
(1) 問題:「現在の日本の首都はどこですか.」
<a href="javascript:saiten(1)">ア 京都</a> <a href="javascript:saiten(2)">イ 東京</a>
<img src="white.gif" name="kekka1" width=62 height=49 border=0>

 ホームページに貼り付けることができる画像形式として,jpg,gifなどがあります.gif特許問題を避けるためにpng形式も利用できるそうですがあまり見かけません.
 
 

 Javascriptでは,Cと同様にコーディングの形式(プログラムの書き方)は自由です−−何列目に何を書かなければならないというような約束はありません.多くの解説書では,Cの先駆者に習ってKR式(この場合のKRは2人の人の名前)で書くようです(関数本体の始まりのブレースを()の直後に置くなど)が,私はネスト(入れ子)が深くなったときの点検のために { と } とを同じ縦列に書くスタイルに決めています.

 ホームページに使えるスクリプト言語(script language)でJavascript以外にマイクロソフト社独自のものがありますので<script language="javascript">......</script>はおまじないとして必ず書きます.<script language="javascript">......</script>の部分は,そのファイル内のどこにあってもよいのですが,本文<body>......</body>の中にあると,画面上の文字や画像などと混乱しやすいので,私はヘッダ部分<head>......</head>に置いています.



■■■ <例1> 実際の見え方 ■■■
(1) 問題:「現在の日本の首都はどこですか.」ア 京都 イ 東京


 function saiten(anum){...}が関数の定義です.これを書いたからといって関数が実行されるのではありません.この関数は saiten(x); の形で書かれたら実行されます.この例では,<a href="javascript:saiten(1)">ア 京都</a>のところと,<a href="javascript:saiten(2)">イ 東京</a>のところに関数の実行文がありますが,これらはリンク同様のものなので,その文字がクリックされたら実行されます.「ア 京都」がクリックされたら,関数saiten()は引数1を受け取ります.そこで,関数定義を見ると引数をanumで表わしているので,anumが1ならば,document.kekka1.srcに "no.gif"が代入されます.これで×が出ます.
 蛇足ですが,関数定義があって,関数の実行文がなければ,関数は実行されません.関数定義がなくて,関数実行文があるとき,その関数が左記saiten()のようにJavascriptの組込関数にないものであれば,エラーメッセージが出ます.このエラーメッセージはファイル読込み時でなく,左の例ではクリックしたときに出ます.
 関数の中に記述された事柄は,関数が呼び出されてから実行されるため,上記の"yes.gif","no.gif"はホームページ閲覧時にはまだサーバ側にあり,解答を選択してから呼び出しに行きます.これに対して,次のようにメッセージに使う画像ファイルをあらかじめメモリに呼び出しておき,解答が選択されたときメモリから出すようにすると,応答が速くなります.
<例2>
//以下をヘッダ部分に記述します.
<script language="javascript">
message21 = new Image();
message21.src = "yes.gif";
message22 = new Image();
message22.src = "no.gif";
function saiten2(anum)
{if(anum == 1)
document.kekka2.src= message21.src;
else if(anum == 2)
document.kekka2.src = message22.src;
}
</script>

//以下はボディ部分に記述します.
(1) 問題:「現在の日本の首都はどこですか.」
<a href="javascript:saiten2(1)">ア 京都</a> <a href="javascript:saiten2(2)">イ 東京</a>
<img src="white.gif" name="kekka2" width=62 height=49 border=0>

 Cと同様に,Javascriptでは等しいかどうかを調べる演算子は == です.これに対して,演算子 = は右辺の値を左辺の変数に代入します.

 Image()型のオブジェクトを作って,それにmessage21という名前を付けます.message21のソ−スにyes.gifを代入します.message22についても同様です.これらはファイルが読み込まれたときに実行されます.つまりmessage21,mesage22はメモリ上にあります.
 Javascriptでは,HTML文書中の文字や画像のような構成要素をdocumentで表わします.左の例では,documentの中のkekka2という画像のソースにmessage21または22を代入しています.
 

 左の例のように同種のものに一度に名前を付けるには,配列を用いることができます.

message2 = new Array(); //message2は配列です.
message2[0] = new Image(); //message2の初めの要素は画像ファイルです.
message2[0].src = "white.gif";//その画像ファイルのソースは"white.gif"とします.
message2[1] = new Image(); //以下同様です.
message2[1].src = "white.gif";
message2[2] = new Image();
message2[2].src = "white.gif";

この場合,関数saiten()による画像差し替えは,document.kekka2.src= message2[1].src;などとなります.



■■■ <例2> 実際の見え方 ■■■
(1) 問題:「現在の日本の首都はどこですか.」ア 京都 イ 東京


 次の例は,テキストボックスによる記述式の解答欄を作り,そこに書かれた文字を採点するものです.ソースを見れば解答が分かりますが,ソースが読めるほどの基礎学力があればほめるべきことなので気にしないことにしています.(もちろん,ソースを見ても簡単には解読できず,元の問題をまじめに考えた方がはるかに簡単となるように変形することはできます.)
 
<例3>
//以下をヘッダ部分に記述します.
<script language="javascript">
message31 = new Image();
message31.src = "yes.gif";
message32 = new Image();
message32.src = "no.gif";
function saiten3()
{if(document.q3.t31.value == "東京")
 document.q3.kekka3.src= message31.src;
else
 document.q3.kekka3.src = message32.src;
}
</script>

//以下はボディ部分に記述します.
(1) 問題:「現在の日本の首都を漢字で書きなさい.」
<form name="q3"><input type="text" name="t31" size="4" value=""><input type="button" name="b31" value="採点する" onClick="saiten3()"><img src="white.gif" name="kekka3" width=62 height=49 border=0></form>

 テキストボックスやボタンはフォームの中に置きます.ボタンが押されたら(onClick),関数saiten3()が呼び出されます.この関数はdocumentのうち,q3という名前のフォームの中の,t31というテキストボックスの値が"東京"と一致しているかどうか文字列として照合します.一致していればmessage31さもなけれれば32に入れ替えます.

 テキストボックスを用いたこの形の教材では,初めに使用する生徒には空欄が見えていますが,次の時間に使用する生徒には,前の時間に他の生徒が記入した解答が残っています.<input type="text" name="t31" size="4" value="">による初期化は1回きりなので,後で述べる完成版のように更新することが大切です.


■■■ <例3> 実際の見え方 ■■■

(1) 問題:「現在の日本の首都を漢字で書きなさい.」 



 

 さて,マウス選択方式とテキストボックス入力方式とを比較すると,どちらが教材に適しているでしょうか?じっくり考えてほしい問題で,まぐれ当たりを避けたいという願いが強ければ,テキストボックスがよいでしょう.しかし,生徒の反応が非常に重くて,教材に向かわせるのが精一杯というような場合は,選択肢の数を増やしてマウス選択にする方が初めのつかみの成功度が高くなるでしょう.また初回に学習するのでなく,全体の範囲を能率よく復習したり,インチキする必要のない大人向けにはマウス選択が喜ばれるでしょう.さらに,多くのテキストボックスに自由に記入させるのは,両手が自由に使える生徒を想定したものですので,手の不自由な方は困るかもしれません−−タブキーを用いると,フォームの要素となっているテキストボックスやボタンへフォーカスを順に移動させることができますが,タブキーとenterキーを片手で操作するのは簡単ではありません.
 数直線上や座標平面上で指定された点を示すのはマウスでしかできないでしょう.

上記のマウス選択方式の完成版
<例4>
//以下をヘッダ部分に記述します.
<script language="javascript">
message4 = new Array();
message4[0] = new Image();
message4[0].src = "white.gif";
message4[1] = new Image();
message4[1].src = "yes.gif";
message4[2] = new Image();
message4[2].src = "no.gif";

function saiten4(anum)
 {if(anum == 1)
   document.kekka4.src = message4[2].src;
  else if(anum == 2)
   document.kekka4.src = message4[1].src;
 }
</script>

//以下はボディ部分に記述します.
(1) 問題:「現在の日本の首都はどこですか.」<a href="javascript:saiten4(1)">ア 京都</a> <a href="javascript:saiten4(2)">イ 東京</a><img SRC="white.gif" NAME="kekka4" BORDER=0 height=49 width=62>


■■■ <例4> 実際の見え方 ■■■
(1) 問題:「現在の日本の首都はどこですか.」
ア 京都 イ 東京

上記のテキストボックス方式の完成版
<例5>
//以下をヘッダ部分に記述します.
<script language="javascript">
message5 = new Array();
message5[0] = new Image();
message5[0].src = "white.gif";
message5[1] = new Image();
message5[1].src = "yes.gif";
message5[2] = new Image();
message5[2].src = "no.gif";
function saiten5()
{if(document.q5.t51.value == "東京")
    document.q5.kekka5.src= message5[1].src;
 else
    document.q5.kekka5.src = message5[2].src;
}
function renew()
{document.q5.t51.value = "    ";
 document.q5.t51.value = "";
}
</script>

//以下はボディ部分に記述します.
(1) 問題:「現在の日本の首都を漢字で書きなさい.」
<form name="q5"><input type="text" name="t51" size="4" value=""><input type="button" name="b51" value="採点する" onClick="saiten5()"><img src="white.gif" name="kekka5" width=62 height=49 border=0></form>
<script language="javascript">
renew();
</script>



■■■ <例5> 実際の見え方 ■■■
(1) 問題:「現在の日本の首都を漢字で書きなさい.」



 左の空欄更新関数renew()のうち,document.q5.t51.value = " ";の部分はいらないはずです.document.q5.t51.value = "";だけで働くはずですが,前のメモリ状態までは初期化されないと思うので,私はなぜかこのように書く習慣にしています.
 空欄更新関数renew();を書く場所は重要です.ブラウザがファイルを前から読んでいくので,もし,<input type="text" name="t51" size="4" value="">よりも前にrenew();を書くと,document.q5.t51.valueを変更しなさいというが,そんなものはない(前方参照のため)という意味で,ファイル読み出し時にエラーメッセージが出ます.だから,この関数の実行文はボディの最後においています.同様の内容を実行するために,onLoad()という組込関数を利用する方法も考えられますが,onLoad()関数に複雑な処理をさせると,動きが不安定になるとどこかに書かれていましたのでこの方法は調べていません.
←覚え書きに戻る ←←メニューに戻る