講義用スタイル
印刷用スタイル

JavaScript 入門

はじめに

この文書は、WWW と HTML をすでに学んでいる人を対象にして、JavaScript の 入門の手引きとなるように書いてあります。はじめての人を対象にしているの で、分かりやすさを優先し、説明もかなり簡単にしています。より興味がある 人は入門書の類が非常にたくさん出版されていますので、適当なものにあたっ てください。この文書の内容は初期の(古い)バージョンのものに基づいてま すが、基本的には新しいバージョンも上位互換なので、学習のとっかかりとし ては古いものでも大丈夫、というより、むしろシンプルで学び易いのではない かと考えています。

JavaScriptとは何か?

そもそも WWW のページ記述のために生まれ た HTML は、画面上にネットワーク上のデータを見やすく 表示することを目的に開発された言語です。したがってHTML 自体でデータを 処理することはできません。なので、データ処理を行いたい場合、当初 は サーバー側 で別プログラムを動かす CGI という手法が使用されてき ました。しかし、この手法はサーバー側にきわめて大きな負担(メモリ、 CPU の資源の浪費) をかけ、 システム全体の処理効率を低下させる という問題を抱えていまし た。

そこで Netscape Communications Inc. は JavaScript を開発しました。これ は、単純なHTMLでは不可能な 動的処理サーバ側 でなく クライアント側(ブラウザソフト上) で可能にするために開発され た言語(処理系)です。

つまり、Edge, Firefox 等のブラウザソフト が JavaScript を動かす インタープリタ(エンジン)を内蔵しているわけです。 もう少し言うと、現在では、ブラウザというソフトウェアは、 の3つの機能を持つ(当初は先の2つしか無かった)、ということです。

JavaScript Process

これにより、それ以前はCGI でなければできなかった多くの処理がクライアン トPC側で可能となりました。元々は Netscape の独自の機能でしたが、その後、 標準化され(一部非互換部分はあるものの)多くのブラウザで実装されました。 一時は非互換部分が嫌われあまり利用されませんでしたが、Web2.0 が提唱され てから Ajax の基幹技術として再注目され、さらに HTML5 ではスタイルシートとともに必須技術となっています。標準化も進 んでいて、 Ecma International という団体によって ECMAScript という仕様でまとめられています。

ちなみに、 JavaとJavaScriptは異なる言語で、JavaScriptはJava の簡易 版などでは決してありません(!) ので、誤解しないようにしてくださ い。とはいえ JavaScript がJava を意識して作られたのは確かで、

  1. Netscape が Sun Microsystems から技術者を引き抜いて開発した、とい うことでそもそも開発者の重なりがあります。
    もはやどちらも会社として存在しません。Netscape は AOL (America OnLine), Sun Microsystems は Oracle に吸収されています。
  2. 上の理由もあって、文法は共通部分がかなりあります。以下、VB(A) との比較で説明します。

  3. オブジェクトという考え方を中心にしている点も同じです。
ということで、似ている点がいろいろあります。

Edge, Chrome 等の ブラウザ とメモ帳, TeraPad 等の テキストエディタ があればすぐ動かすことが出来る(つまり動作環境を 簡単に用意できる)ので、初学者向けに「Javaを学習する前にJavaScriptを学 習しておくとJavaが分かりやすい」と言われることはあります。

HTML5 時代になって、かなり複雑になってきましたが…ちなみに Java 自体は 文法的には C++ の影響をかなり受け ていると思われ、上で述べてある特徴はほぼ C++ にも当てはまります。

JavaScript におけるオブジェクト指向

プログラムをオブジェクトの組み合わせとして書く手法をオブジェクト指 向プログラミングといい、これに用いられるプログラム言語をオブジェ クト指向言語と呼びます。Java, C++, VisualBasic.NET などが該当しま す。JavaScriptは、上記の言語ほどオブジェクト指向の程度が強くないので、 オブジェクトベース言語といわれることがあります。
とはいえAjax 時代になり DOM(後述)全盛の今では、オブジェクト指向と呼ぶ ほうが主流かもしれません。
いずれにしても、プログラミングの中心的作業はオブジェクトに関するもので ありますので、以下、重要な概念である「オブジェクト」 「プロパティ」 「メソッド」について簡単に説明します。こ れらは VB.NET, Java等での概念とほぼ同じものなので、それらに馴染んでいる 人に特に問題はないと思います。

オブジェクト

オブジェクトは、正直わかりにくい概念かもしれません。当面、とりあえ ずオブジェクトはプログラムの部品 であると考えてください。たと えば、パソコンを組み立てるときには、多くのボードや周辺機器を使用します。 それらには、あらかじめ、必要な機能が組み込まれているわけです。プログラ ムを作成する場合も、特定の機能をもつ部品を寄せ集めて作成すると楽、とい うわけで、そのようなものを提供する手段の1つがオブジェクトなわけです。例 えば JavaScriptには、Date というオブジェクトがあり、このオブジェクトに は、年、月、日、時、分、秒を扱う機能があります。それで、たとえば現在の 日付、時間を知りたい場合には
   today=new Date();
と記述すると、パソコンに内蔵されている時計の時刻から現在の年、月、日、 時、分、秒などのデータを作成して、todayに記憶します。また、todayに記憶 された時間を取り出すには、
   hour=today.getHours();
のように書きます。

プロパテイ

オブジェクトは、プロパテイをもちます。プロパテイは、英語のproperty で、 属性、財産、所有物といった意味です。ですので、オブジェクトのプロパテイ はオブジェクトのもつ性質 と考えられます。

たとえば、画面に情報を表示するDocumentというオブジェクトは、fgColor、 bgColorなどのプロパテイをもちます。前者は、Document上の文字の色 (foreground color) 、後者は背景の色(background color)を指定する機能が あります。

たとえば Document.fgColor="red" のように 記述すると、文字の色が赤になります。オブジェクトは、それぞれその機 能に見合ったいろいろなプロパテイをもっているので、プロパテイの意味 と使い方を知ることがJavaScriptを習得する重要な部分となります。これ らについては例題で少しずつ学習していきます。

メソッド

メソッドは、簡単にいうと「動作(方法)」で、オブジェクト の実行・操作を表します。プロパテイと同じように、オブジェクトはそれ ぞれ、その機能に見合ったいろいろなメソッドをもちます。たとえば、 writeは、HTML で表現されたデータを画面上に表示するメソッドです。し たがって、
   document.write(abc)
 は、変数abcの内容を画面上に表示します。また、上記のgetHours() は、時間を入手するメソッドで、
   hour=today.getHours()
は、todayというオブジェクトから時間を入手して変数hourに記憶させるもの です。

いずれにしろ、JavaScriptでは、オブジェクトとプロパテイ、そして、オ ブジェクトとメソッドの関係を理解することが非常に大事です。

ここまでのまとめ

要するに、JavaScript によるプログラムとは;
  1. まず必要なオブジェクトを用意します。document 等、いくつかのオブ ジェクトは最初から用意されていますし、他のものも必要に応じて new (新規に生成)すれば利用できます。
  2. 必要に応じてプロパティを設定します。
  3. メソッドを呼び出して、処理を実行します。
に尽きると思います。あとは例題とその説明をみて、すこしずつ学んでいきま す。

サンプル(例題)とその説明

以下、いくつかのサンプルをみていくことで、具体的に JavaScript に馴染んで いきましょう。

サンプル1:文字の表示

まず、 サンプル1 を動かしてみてください。

このソースは以下の通りです:

<html>
<body>
<script>
  document.fgColor="#00ff00";  //←前景色(文字の色)を緑色に設定
  document.bgColor="#ffffff";  //←背景色を白色に設定
  document.write("<h1>**** WELCOME to JavaScript! ****</h1> ");
  document.write("<h2>**** Let's learn JavaScript ! ****</h2>");
  document.write("**** WELCOME to JavaScript ****");
</script>
</body>
</html>
ここで、簡単に説明しておきます。
  1. JavaScriptの位置

    JavaScriptの記述は、スクリプトの始まりを示す <script>と、終わりを示す </script> の間に書かれます。

    <script>
       JavaScriptによる記述
    </script>
    
    このとき、scriptがJavaScriptであること(実は JavaScript 以外にも VBScript なども指定できる場合があります)の記述や、JavaScriptを読めな いブラウザのための配慮を次のように書くことがあります。
       <script language="JavaScript">  
       <!--
              JavaScriptのコード
       //      -->
       </script>
    
    ここで、

    • <!-- と --> で囲まれてる部分(上の場合は3行)はHTMLとしての コメント(無視される部分)であり、
    • // は JavaScript としてのコメント(その行が無視される)であるので、

    これら2つを組み合わせることで、HTML としても JavaScript としても文法的 に問題なく、かつ非対応ブラウザにとっては無いものとみなせることになりま す。とはいえ、最近では非対応ブラウザはかなり少なくなってきてる、という こともあり、これ以降このページの説明ではこれらの記述を省略します。
  2. document オブジェクト

    document は、処理中の文書についての情報をもち、HTMLの出力を表 示するメソッドをもつ、基本中の基本のオブジェクトです。このオ ブジェクトは、anchor, form, bgColor, fgColorなどのプロパテイと、clear, close, open, write, writeln のメソッドをもちます。

  3. 前景色 (フォアグラウンドカラー)

    前景色は、ドキュメント上のテキスト(文字)の色を示します。前景色は、ド キュメントのfgColorプロパテイにより、次の形式で示されます。

       document.fgColor="# 色の指定"
    
    使用される色は、光の三原色(赤、緑、青)の各要素の濃さを「00」から「ff」 までの16進数2けたで表したものを、左から赤、緑、青の順にならべた文字定 数の形式で表現したものです。このとき、いちばん濃い色が「ff」で、また、 いちばん薄い色が「00」で表され、各色は256通りの濃さで表現されることに なります。したがって、赤、緑、青の組み合わせでは 256x256x256 = 16777216(約千七百万)種類の色の表現ができます。最近はあまり聞かなくな りましたが、これをフルカラーということがあります。

    よく使用される色の例を次に示します。

    16進数の表示色の名称16進数の表示色の名称
    #FF0000赤色#00FF00緑色
    #0000FF青色#FFFF00黄色
    #00FFFF水色#FF00FF紫色
    #FFFFFF白色#000000黒色
    #808080灰色#FF5500オレンジ色
    #7777aa青灰色#00FF11蛍光黄緑色

    色の表示には、この他、いくつかの英単語の色の名前を使用できます。たとえば、

       document.fgColor="red";
    
    と書くと、前景色が赤となります。この方が上記の方法より楽なので、最近では、 特別の場合を除いて英語の色の名前を使用することが多いと思われます。

  4. 背景色(バックグラウンドカラー)

    背景色は、ドキュメントの背景の色です。背景色は、bgColorプロパテイにより 次の形式で示されます。使用される色の指定は、上記と同様で、もちろん英単語 も使用できます。

       document.bgColor="# 色の指定" 
    
    たとえば、
       document.bgColor="#0000ff"
    
    は、水色の背景色を表示します。また、
       document.bgColor="pink"
    
    は、ピンクの背景色を表示することになります。

  5. document.write

    writeメソッドは、右側のかっこ内の文字列や、変数の内容を画面に 表示します。一般的なプログラムにとっての print 文と同じような意味合い (要するに、処理結果の単純出力)です。たとえば、

    document.write("答えは",abc)
    
    では、文字列の「答えは」と変数abcの内容が表示されます。ちなみに括弧内 には HTMLのタグも使用できるので、いろいろな表現が可能です。と いうか、HTML を吐き出すための仕組みが document.write だ、という捉え方 もできます。
    なお、繰り返しになりますが、<h1>、<h2>などのタグは、本来 「見出し」という意味構造を付与するためのタグであり、文字の大き さを表すためのものではないことに注意してください。文字の大きさなどは、 スタイルシートで指示すべきものでしょう。

サンプル2:フォーム, ボタン及びアラートダイアログボックス

まず、 サンプル2 を動かしてみてください。

このソースは以下の通りです:

<!doctype html> <html> <head> <meta charset="UTF-8"> <title> sample 2 </title> </head> <body> <script> document.bgColor="#90ee90"; </script> <form> <input type="button" value="このボタンをクリックしてください。" onClick="alert('ようこそ JavaScriptへ')" > </form> </body> </html> 以下、またまた説明です。
  1. フォーム

    フォーム(form)は、JavaScript ではなくHTMLで規定されている機能です。 テキストを入力したり、チェックボックス、ボタンなどのいろいろなオブジェ クトから何かを選択するときに使用されるオブジェクトです。ちなみにフォー ムは、JavaScript だけではなく CGI での入力、すなわちサーバーにデータを 送る場合にも使います。フォームとフォームの中に書かれるinputタグ及びボ タンの属性については詳細は略しますが、ここでは、このようにすればスクリ プトが呼べる、くらいを覚えておいてもらえればいいでしょう。

  2. onClickイベントハンドラー

    (特にGUI アプリケーションで)ある動作を行うこと(発生した動作)を イベント(event, 出来事)といいます。マウスでボタンをクリックした り、マウスのカーソルを画面の特定の位置を横切ったり、また、データを入力 したりすることはすべてイベントです。そして、あるイベントが生じたときに、 特定の処理を行うようにすることができます。イベントハンドラー (event handler) とは、このために使用するものです。

    VB で Button1_Click とかでコマンドボタンをクリックされた時の処理をプ ロシージャとして記述するのと同じです。
    クリックイベントが発生した場合に実行される手続きは、onClickイベント ハンドラーによって示されます。この形式は
       onClick=" 実行される手続きを示すJavaScriptのコード "
    
    です。この例題では、フォームのボタンがクリックされるとウインドウ上にア ラートダイアログボックスがポップアップされて表示されます。JavaScriptで 書かれたコードは、このようにイベントハンドラーの中にも書くことができま す。

  3. アラートダイアログボックス

    アラート(alert)ダイアログボックスは、メッセージとOK ボタンだけを表示するボックスで、ある状況の確認だけを 行います。

    VB の MsgBox と同じです。
    このボックスから、ユーザがなにかを選択することなどはできません。ち なみにダイアログ(dialog(ue))「対話、問答」とい うような意味です。アラートダイアログボックスの形式は、
       alert("表示するテキスト")
    
    です。ですので、この例題では、「ようこそ JavaScriptへ」という文字 が表示されるわけです。ちなみにコードでは ' (single quote、引用 符)で文字列がかこまれていますが、これはイベントハンドラを示 すために " (double quote、二重引用符)で囲っているので、" をつかうとその囲いをはずすことになってしまうからです。文字列を指定 するのは JavaScript では'' (single-quote pair) でも "" (double-quote pair) でもどちらでもよいことになっています。

サンプル3:Date オブジェクト

さて、 サンプル3 を動かしてみてください。

このソースは以下の通りです:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<script>
  now= new Date();//←現在の時刻の取得
  document.write(now);//←オブジェクトnowの内容を表示
  document.write("<hr size=10>");//←水平線を引くHTMLタグ
  year=now.getYear();//←ここからは、年、月、日、時、分、秒の取得
  year=(year < 2000) ? year+1900 : year;//ここでブラウザの差を補正している
  month=now.getMonth()+1;
  date=now.getDate();
  hour=now.getHours();
  minute=now.getMinutes();
  second=now.getSeconds();
  document.write("今は,",year,"年",month,"月",
    date,"日",hour,"時",minute,"分",second,"秒です。");//←取得したデータを表示
</script>
</body>
</html>
  1. DOCTYPE と charset 属性

    HTML5 時代になって、ブラウザ自体がかなりかわってきていることもあり、特 に文字コードまわりは注意が必要になってきています。ASCII だけのページの 場合は問題がないのですが、漢字仮名をつかう場合、以前は JIS (ISO-2022-JP 7bit code) であれば大抵大丈夫だったのですが、今はしっかり 指示してやらないといけません。

    実は前のサンプル2でも指示してましたが、時間の関係で説明を後回しにして いました。

    そこで、まず HTML タグの前に

    <!DOCTYPE html>
    
    としてやることでこの文書が HTML5 準拠であることを示した上で、 HEAD 要素の中で META タグの属性指定を使って
    <meta charset="UTF-8">
    
    として、この文書の 文字コード が UTF-8 である、とブラウザに教 えてやればいいでしょう。もちろん他のコードでもいいのですが、昨今では (国際化も考慮して?)UTF-8 を使っておくのが無難なようです。もちろんそ の場合、HTMLファイルの文字コードも UTF-8 で保存しないといけないのは言う までもありません。
    要するに meta での宣言とそのファイルのコードがあっていれば良いので、ちゃ んと理解した上でなら SHIFT_JIS や ISO-2022-JP を使っても問題はありませ ん。

  2. Dateオブジェクト

    現在の時刻を取得するオブジェクト変数名を now とすると、

       now = new Date()
    
    という式で、現在の時刻(年、月、日、時、分、秒)をもつオブジェク ト を新たに 生成 (new) し、 =(代入) によって、 そのオブジェクトをオブジェクト変数、つまりオブジェクトを預っておく箱 (?)である now が受け取ります。この時刻は、システム内部で管理されてい るものです。ちなみにこの生成されたオブジェクト(この場合now)のことをイ ンスタンスと言い、雛型のオブジェクト(この場合Date) であるクラスと言い 分ける場合があります。なおシステムの制限で 1970年以前 の時間は使用できないことになっ ています。 これは、主に UNIX/C の実装による制限であり、 2038年問題 としてもよく知られています。 この例題では、こうして得られたnowオブジェク トの内容を
       document.write(now) 
    
    で表示しています。この時 now オブジェクトの内容は適宜文字列に変換されて から表示されていることになります。その際、そのパソコンが使用されている 地域に応じて、東京(標準時), JST, PST, UTC, GMTなどの語が表示されます。 ちなみにPST は、太平洋標準時間(Pacific Standard Time)です。 UTC は協 定世界時 (Universal Time, Coordinated)で、GMT =グリニッジ標準時 (Greenwich Mean Time) と(ほぼ)同じ時間を表します。
    厳密にいうと、GMT は微妙にずれるのですが、UTC は原子時計を使っていてず れを補正するので、UTC のほうが正確です。

  3. 年、月、日などを取得するメソッド

    Date のオブジェクト(インスタンス)から年、月、日などを取得するには、 次のメソッドを使用します。

    メソッド説明
    getYear() 西暦の年の取得:ただし、(Mozilla 等のブラウザに 対応する、等)必要な場合は、1900を加えます。
    getMonth() 月の取得:ただし月は1月を「0」,2月を「1」とする整数で表されているので、 1を加えて正しい月名とします。
    getDate()日の取得:1から31までの整数が取得されます。
    getDay()曜日名の取得:日曜日が「0」、月曜日が「1」の ように取得されます。
    getHours()時間の取得:0から23までの整数が取得されます。
    getMinutes()分の取得:0から59までの整数が取得されます。
    getSeconds()秒の取得:0から59までの整数が取得されます。

  4. now.getYear()などの処理

    上で述べたようにnowには、年、月、日、時、分、秒が記憶されています。この オブジェクトから年、月などを個別に取り出すには、上記のメソッドを使用して

       year = now.getYear()
    
    などと記述します。このようにすると変数 yearには、取得された年の値が記憶 されるわけです。

サンプル4:ファンクションと onBlur イベント

まず、 サンプル4 を動かしてみてください。

このソースは以下の通りです:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
function getname(str) {  // 関数の定義
  alert("今日は, " + str + "さん!");
}
</script>
</head>
<body>
氏名を入力してください。入力が終わったらTABキーを押してください。
<form name="form1">			
<input type="text"
	name="yourName"
	onBlur="getname(this.value)" 
	value="">  <!-- 入力された値は、このvalueに記憶される --> 
</form>
</body>
</html>
  1. function (ファンクション、関数)

    function は JavaScript を構成する基本的な要素のひとつです。function は、 ある処理を行うためのひとつ以上のステートメントの集まりをまと めたもの です。そして、function はあるまとまった(何回も同じよう なことが行なわれる)処理を モジュール化 しておくことで、 繰り返し使いやすくする と同時に バグもはいりにくく しま す。

    ここで、function は特にどれかのオブジェクトに属しているわけではないこと に注意してください。 Java などでは全てのメソッドはかならずなにかのオブジェ クトに属していたわけですが、JavaScript ではそのような縛りはありません。 これが、「オブジェクト指向」ぽく無い要素の1つであったりします。
    …と昔は説明していましたが、HTML5 時代では、形式的には document オブジェ クトのメソッドの扱いになるようです。
    VB でプロシージャと呼ばれてたものがこれに対応するわけです。VBでは返り 値を持つものが Function プロシージャ、そうじゃない(値をかえさない)も のは Sub プロシージャと(宣言形式から)わけられてましたが、JavaScript ではなんでも function です (C/C++ 風)。

    ちなみに VBA ではプロシージャは必ずしもオブジェクト(クラス)に属する わけではありませんでしたが、VB.NET ではオブジェクト指向を極めてる(?) ので、原則として必ずなんらかのクラスに属します(メソッドの位置付け)。

    …と昔は説明していましたが、今の VBA では、Project 内の Module オブジェ クトのメソッドの扱いになるようです。ただ、それを意識する場面はほとんど 無いと思います。
     functionを定義する形式は、次のとおりです。

    function ファンクション名(引数名1、引数名2,…引数名)
    { 処理内容を示すひとつ以上のステートメント } 
    

    引数名は、このファンクションを利用するときにこのファンクションに渡され るデータの名前です。なお、引数を必要としない場合は、 ()だけ を 書きます。この例題では、strを引数とする getname(str) というファンクショ ンが定義されています。その内容:

       alert("今日は, " + str + "さん!");
    
    は、 「今日は」という文字列と、 引数(str)の内容と、 「さん!」という文字列を 「+」で繋げて、
       今日は,引数(str)さん!
    
    のように引数の前後に文字をつけてアラートボックスに表示するものです。
    VBA では 「&」で文字列を連結していましたが、 JavaScript では「+」で繋げます。言語によって同 じことを違うやりかたでやるのでややこしいですが、そういうものだと思って ください(?)ちなみにCだと、strcat() 関数を使わないと文字列と文字列は 繋げられません(!?詳細略)
    そして、このファンクションは、フォーム中の onBlurイベントハンドラー で呼び出されるわけです。ちなみに fucntionは通常ヘッダ部、すなわ ち
      <head>………………</head>
    
    の中に定義します。というのは、ヘッダ部でファンクションを一度定義しておく と、プログラムのいろいろな場所から何度でも呼び出して使用でき、便利だから です。

  2. onBlur イベントハンドラー

    onBlur は、あるオブジェクト(例えばテキストボックス)が フォーカ ス を失ったときに実行されるイベントハンドラーです。フォーカスとは、 今注目されてるところ、といった意味で、具体的には テキストボックスの場 合だとクリックして入力待ちしてる状態 のことです。 この例では、テキストボックスに氏名を入力した後、tabキーを押す か、テキストボックス以外のフォーム上でマウスをクリック したりすると、このテキストのvalueにその名前が記憶されるとともに、 フォーカスが失われますのでonBlur イベントが発生し,この場合には関数の getnameが実行される、という流れです。このとき valueに記憶されているデー タが引数として、getname に渡されます。

    なお this.value の this は「このオブジェクト」という意味で、この場合に は input オブジェクトを表します。したがって this.value はその value プロパテイの内容を指しています。

サンプル5:クッキー

まず、 サンプル5 を動かしてみてください。

このソースは以下の通りです:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> Cookie sample</title>
<script language="JavaScript">
function getCookie(str) {
  tmp = document.cookie+";";
  tmp1 = tmp.indexOf(str,0);
  if (tmp1 != -1) {
    tmp = tmp.substring(tmp1, tmp.length);
    start = tmp.indexOf("=",0)+1;
    end = tmp.indexOf(";",start);
    return(unescape(tmp.substring(start, end)));
  }
  return("");
}
function inputName() {
  names = prompt("名前を入力してください。","Your Name");
  if (names == null) {
    inputName();
  }
  setCookie("Name", names);
}
function setCookie(key,value) {
  tmp = key + "=" + escape(value) + "; ";
  day=new Date();
  day.setTime(day.getTime() + 30 * 24 * 60 * 60 * 1000); // 30日
  tmp += "expires=" + day.toGMTString() + ";";
  document.cookie=tmp;
}
function deleteCookie() {
  if (document.cookie != "") {
    tmp = document.cookie.split(";");
    expireDate = new Date();
    expireDate.setYear(expireDate.getYear() - 1);
    for (i=0;i<tmp.length;i++) {
      cname = tmp[i].split("=")[0];
      document.cookie = cname + "=; expires=" + expireDate.toGMTString();
    }
    alert("cookie を" + tmp.length + "個、削除しました。");
  } else {
    alert("削除すべきcookie はありません。");
  }
}
</script>
</head>
<body>
お名前を覚えます。

<script language="JavaScript">
names = getCookie("Name");
if (names == "") {
  inputName();
}
document.write("ようこそ、" + names + " さん!");
</script>
</body>
</html>
今回は結構ステップ数が多いので、いつも以上に簡単に解説します。
  1. そもそもクッキーとは何かをまず説明します。クッキーは、クライア ント側にサーバーの情報を残しておく仕組みです。どういうことかと いうと、上で述べたように、原則として、JavaScript では状態、すなわちサー バと関係する保存ができないわけですが、絶対に状態を持てないとなると、現 実問題として困ることがあります。例えば通常 「セッション管理」 と言われてるものですが、WWW (http) は セッション管理をしな い 、すなわちクライアントから要求をうけて、返事をかえしたらそれで おしまいで、アクセスされたという情報は原則として持てない です。 それで、そのままであれば、通販サイトなどでログインユーザー (user ID) の 管理などは出来ないことになります。
    リンクをたどって画面が変わったら、前にいた画面の情報は無くなってしまう、 ということですから、折角ログインしても、その情報の行き場がない、という わけです。
    そこで、最近の Web アプリケーションではいろいろな方策がこうじられており、 その中の代表的なものとしてクッキーがあるというわけです。これは、例外的 にほんの少しの情報だけ サーバー から クライアント側のディ スク に情報を置かせてもらうことで、このセッション管理などを可能と する機能です。

  2. クッキー自体はブラウザには(概念的に)1つしか無いのですが、 当然ながら、その中でアクセスしたサーバー毎に別管理してます。ですので、 Aというページ(サイト)で埋め込んだクッキーの内容とBというページでう めたクッキーは混ざりあったりはしないです。
    とはいえ、ブラウザやサーバーのバグ(セキュリティホール)等で別のサイト でうめたクッキーを参照できることが絶対にないとはいえません。よく知られ ているものには XSS (クロスサイトスクリプティング)と呼ばれるものがあり ますが、詳細はここでは略します(別資料で説明の予定)。クッキーにはセッ ション情報として、認証のためのユーザIDとパスワードが入っている場合が あったり、さらに(最近はさすがにほとんど見かけませんが)クレジットカー ドの番号等個人情報がある場合もあるので、セキュリティホールの情報には常 に敏感であるとともに、個人情報を安易にクッキーに置くことはシステム設計 として避けるべきです。

  3. JavaScript 内では、
    document.cookie
    
    と、document オブジェクトのcookieプロパティを参照したり 設定したりすることで、クッキーを操作します。 その内容は
    要素名 = 要素内容 ;
    
    です。上の例では Name という要素名にユーザ名を埋め込むこと にしていて、最初にアクセスしたときには設定されてないので inputName() 関数を呼び出して設定します。2回目以降は既に設 定されてるのでそれを読み出して表示する、ということをしてま す。
    
    

  4. クッキーは、普通有効期限が設定されます。一旦仕込んだ(クッキー にデータを保持することをよく「仕込む」とか「埋める」とか言います)情報 は未来永劫不変というわけではないですし、セキュリティの観点からも適宜更 新することは大切だからです。ちなみにこれを省略すると、そのセッション中 のみ有効(つまり一旦ブラウザを閉じるとその時点で無効になる)となります。

    有効期限設定ためのキーワードが expires です。上でも使われているように

    day=new Date();
    day.setTime(day.getTime() + 30 * 24 * 60 * 60 * 1000); // 30日
    tmp += "expires=" + day.toGMTString() + ";";
    
    と書き足すことで、このクッキーの有効期限が30日という設定をすることがで きます。つまり、
    1. 今の時刻を取ってきて、
    2. それに30日分のマイクロ秒を加えた値を setTime で設定しなおして、
    3. それを GMT 表記の文字列に変換した後でexpires=に代入している、ということです。
    ちなみに a+=b とは a=a+b と同じで、要するに、「a に b を足す」とは「 a に b を足した値が新たに a の値になる」ということです。慣れれば += のほ うが理解しやすいと思います。実はこの演算子は C++/Java/VB.NET 他、かな りのプログラミング言語で使えます。
    これはクッキーの消去に利用できます。すなわち、有効期限を過去の時点 と設定しなおせば、自動的に消えるということです。このサンプルでは (実際に利用はしていませんが)この仕組みを使った deleteCookie() と いう関数が用意されていますので、これを呼び出すとクッキーが消せます。

  5. inputName 関数の中で呼ばれている prompt は前にやった alert の ように別窓でダイアログをだすものです。alert は単に確認(OK)するだけだっ たのですが、それに対して prompt はテキストボックスを開いて、そこに 入力を促す(prompt) ことができます。引き数は2つで、1つめが (入力を促すための)メッセージで、2つめが入力の初期値です。この関数の 返り値として入力された文字列(テキスト)がうけとれます。

  6. あと、いろいろなところでつかわれている escape 関数とは、 (いわゆる 半角)アルファベット数字 (ASCII の [0-9A-Za-z]) 以外 (!)を"%??" と いうふうに %に続く 16 進数2桁(8ビット)に変換する関数で、unescape は その逆(元に戻す)関数です。(7bit JIS の)漢字仮名(いわゆる全角文字) の場合、"=",";" などの文字が内部で使われる可能性もあるわけですが、そう なるとクッキーの設定式での記号を混乱する可能性があるので、漢字仮名を使 う場合はかならずエスケープするようにしてください。

サンプル6

アニメーション を動かしてみてください。いわゆるパラパラマンガです。ソースは以下の通りです。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>
Anim. Sample page</title>
<SCRIPT LANGUAGE="JavaScript">
var delay = 1000;   // 切り替え周期(m秒)
var pages    = 5;   // 画像の枚数
//------------------------------------------------
var ii = 0;
il = new Array();
for (i=1; i<=pages; i++) { // 画像は img001.gif から決め打ち 
  il[i] = new imageItem("img00" + i + ".gif");
}

function imageItem(iloc) {
  this.image_item = new Image();
  this.image_item.src = iloc;
}

rotateImage = function () {
  ii = ii % pages + 1;
  var new_image = il[ii].image_item.src;
  document["target1"].src = new_image;
  setTimeout(rotateImage, delay);
}
function speedup() {
	delay /= 2;
}
function speeddown() {
	delay *= 2;
}
</script>
</head>

<body OnLoad="rotateImage('target1')">
<FORM>
<INPUT TYPE="button" VALUE="Speed up" onClick="speedup()">
<INPUT TYPE="button" VALUE="Speed down" onClick="speeddown()">
</FORM>
<br>
<img name="target1" src="img001.gif" width=441 height=331>
</body>
</html>
これも長いので、さらに簡単に説明します。ヘッダの部分や変数の定義はおいといて;

サンプル7

2進数ドリル を動かしてみてください。これは、2進数の独習用に、計算のドリルとして試 作したものです。一度じっくり読んで見てください。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> JavaScript sample</title> 
<script language=javascript>
<!--
function anscheck (f, op) {
   var flag = 1;
   flag &= anscheck0 (f.val00.value, f.val10.value, f.cell00, op);
   flag &= anscheck0 (f.val01.value, f.val10.value, f.cell01, op);
   if (flag == 1)
      alert("Very Good! (^_^)");
   else
      alert("だめ!もう一度計算して!!");
}

function anscheck0 (b1, b2, c, op) {
      for (i=0; i < b1.length; i++) {
 	c1 = b1.charAt(i);
 	c2 = b2.charAt(i);
	c0 = c.value.charAt(i);
	if (op == "AND") {
	   if (calcand(c1,c2,c0) != 1) {
	      c.style.color = "red";
	      return 0;
           }
        } else if (op == "OR") {
	   if (calcor(c1,c2,c0) != 1) {
	      c.style.color = "red";
	      return 0;
           }
        } else {
           alert("何を計算するの?!");
        }
      }
      c.style.color = "black";
      return 1;
}

function calcand(c1,c2,c0) { // CALCulate AND
  if (c1 == "1" && c2 == "1") {
    return c0 ;
  } else {
    return c0 ==  "1" ? 0 : 1 ;
  }
}

function calcor(c1,c2,c0) { // CALCulate OR
  if (c1 == "0" && c2 == "0") {
    return c0 ==  "1" ? 0 : 1 ;
  } else {
    return c0 ;
  }
}

// -->
</script>
</head>
<body>
<h1>
ビット演算の演習用ページ
</h1>

<FORM>
<table border=1>
<tr>
<th> AND/OR </th>
<input type=hidden name=val00 value="100101">
<th> 100101 </th>
<input type=hidden name=val01 value="011010">
<th> 011010 </th>
</tr> 
<tr> 
<input type=hidden name=val10 value="111001">
<th> 111001 </th>
<th>
<INPUT TYPE="text" NAME="cell00" VALUE="" SIZE=7>
</th>
<th>
<INPUT TYPE="text" NAME="cell01" VALUE="" SIZE=7>
</th>
</tr> 
</table>
<p>
<INPUT TYPE="button" NAME="kaitou00" VALUE="AND(論理積の計算チェック)"
 onClick=anscheck(this.form,"AND")>
<INPUT TYPE="button" NAME="kaitou00" VALUE="OR(論理和の計算チェック)"
 onClick=anscheck(this.form,"OR")>
</FORM>
<p>
<p>
</body>
</html>
とはいえ、少しだけ簡単にコメントすると、

サンプル8

最後に、 電卓 を動かしてみてください。これも一度じっくり読んで見てください。サン プル7同様、フォームの各要素をオブジェクトとして扱うところの妙をみ てください。 <!DOCTYPE html> <HTML> <HEAD> <META charset="utf-8"> <TITLE> JavaScript sample</TITLE> <script language=javascript> Total = 0; // 現在の合計値 Input = ""; // 現在入力している値 Calc = "+"; // 合計と入力値の演算子 Flg = 1; // 1回前に入力したもの 0:数字 1:演算子 function Value(Data){ // 0ー9または小数点ボタンを押した Flg = 0; // 1回前に入力したものは数値 Input += Data; // 現在入力している値に追加 document.myForm.myLine.value = Input; // 現在入力している値表示 } function Calculate(Data){ // 演算ボタンを押した if (Flg==0){ // 1回前に入力したものは数値か? Flg = 1; // 1回前に入力したものは演算子 Work = Total + Calc + Input; // 一連の計算式を作る Total = eval(Work); // 計算式を計算させる Input = ""; // 現在入力している値をクリア document.myForm.myLine.value = Total; // 合計を表示 } if (Data == "="){ // 演算ボタンは[=]か? Total = 0; // 合計をクリア Calc = "+"; // 演算子を[+]とする }else{ // 演算ボタンは[=]以外である Calc = Data; // 演算子を退避させておく } } function Clear(){ // クリアボタン[C]を押した Total = 0; // 合計クリア Calc = "+"; // 演算子クリア Input = ""; // 現在入力している値をクリア document.myForm.myLine.value = Total; // つまり、0を表示 } </script> </HEAD> <BODY> <form name="myForm"> <table border="2" cellpadding="2" cellspacing="0" bgcolor="lightgreen" bordercolordark="black" bordercolorlight="gray"> <tr> <td align="center" colspan="4" bgcolor="salmon"><font color="blue" size=4> 電卓 </font></td> </tr> <tr> <td colspan="3"><input type="text" size="15" name="myLine" value="0"></td> <td align="center"><input type="button" value="C" onclick="Clear()"></td> </tr> <tr> <td align="center"><input type="button" value=" 7 " onclick="Value(7)"></td> <td align="center"><input type="button" value=" 8 " onclick="Value(8)"></td> <td align="center"><input type="button" value=" 9 " onclick="Value(9)"></td> <td align="center"><input type="button" value=" ÷ " onclick="Calculate('/')"></td> </tr> <tr> <td align="center"><input type="button" value=" 4 " onclick="Value(4)"></td> <td align="center"><input type="button" value=" 5 " onclick="Value(5)"></td> <td align="center"><input type="button" value=" 6 " onclick="Value(6)"></td> <td align="center"><input type="button" value=" × " onclick="Calculate('*')"></td> </tr> <tr> <td align="center"><input type="button" value=" 1 " onclick="Value(1)"></td> <td align="center"><input type="button" value=" 2 " onclick="Value(2)"></td> <td align="center"><input type="button" value=" 3 " onclick="Value(3)"></td> <td align="center"><input type="button" value=" − " onclick="Calculate('-')"></td> </tr> <tr> <td align="center"><input type="button" value=" 0 " onclick="Value(0)"></td> <td align="center"><input type="button" value=" ・ " onclick="Value('.')"></td> <td align="center"><input type="button" value=" + " onclick="Calculate('+')"></td> <td align="center"><input type="button" value=" = " onclick="Calculate('=')"></td> </tr> </table> </form> </BODY> </HTML>

おまけ

最後の最後に、 A city in a bottle を見てください。ネットで見付けたものです。本文はたったのこれだけ (本当は1行)で動いているのは脅威ですし、JavaScript の奥深さを知ら される作品です(!) Click me! <canvas style=width:99% id=c onclick=setInterval('for(c.width=w=99,++t,i=6e3;i--; c.getContext`2d`.fillRect(i%w,i/w|0,1-d*Z/w+s,1)) for(a=i%w/50-1,s=b=1-i/4e3,X=t,Y=Z=d=1; ++Z<w&(Y<6-(32<Z&27<X%w&&X/9^Z/8)*8%46||d|(s=(X&Y&Z)%3/Z,a=b=1,d=Z/w)); Y-=b)X+=a',t=9)>
トップページに戻る

講義用スタイル
印刷用スタイル (開いてから、ページを再度更新してください)