JavaScript 言語入門: 第 2 回 イベント、cookie、タイミング、その他

JavaScript は、ますます盛んに使われるようになっており、今やインターネットで最も広く使用されている言語の 1 つと言えるほどになっています。さまざまなプラットフォームとブラウザーで使用できる JavaScript 言語は、バックエンドの言語を選り好みしません。また、多くの優れたライブラリーが開発を支援してくれますが、時として、これらのライブラリーは本来の JavaScript 言語からかなり逸脱しているため、駆け出しの開発者が言語の基礎を理解できないことがあります。連載の第 2 回となるこの記事では、引き続き JavaScript の基礎を説明します。今回取り上げるのは、イベント、try...catch 文、cookie の使用、そしてタイミング関連の関数です。

Kris Hadlock, Web Developer/Designer, Studio Sedition

Photo of Kris HadlockKris Hadlock は、1996年から契約 Web 開発者および設計者として、SPIN Magazine、IKEA、United Airlines、JP Morgan Chase、GoDaddy Software、Fire Mountain Gems などの企業のプロジェクトを手掛けてきました。著書には『Ajax for Web Application Developers』(Sams)、『The ActionScript Migration Guide』(New Riders) があります。また、コラムニストおよびライターとしても、Peachpit.com、InformIT.com、Practical Web Design magazine などの数々の Web サイトや設計関連の雑誌で活躍しています。彼は、フォームと関数の融合を専門とする Web 設計およびソフトウェア開発会社、www.studiosedition.com の創始者でもあります。



2011年 9月 09日

JavaScript 言語入門」の第 1 回では、JavaScript 言語の絶対的な基礎として、script タグの作成からコメントの使用、HTML 文書に JavaScript ファイルを含める方法、変数の定義、演算子の使用、配列の定義、条件文の使用、関数の定義、ループの使用に至るまで、数多くの話題を取り上げました。今回の記事では第 1 回の続きとして、駆け出しの開発者がこの言語の基礎を理解できるように、前回説明しなかった他の基本的な JavaScript 言語の概念を説明します。この記事で説明する基礎知識によって、使用するライブラリーの理解を深め、そもそもライブラリーを使用する必要があるかどうかを決定できるようになるはずです。さらには、自分でライブラリーを作成してみようという気になるかもしれません。この記事には、全体にわたって、それぞれの概念の使用方法を示すサンプル・コードが満載されています。

イベント

イベントは、JavaScript 言語であらゆるタイプの対話性を Web ページに追加するための触媒となります。すべての HTML 要素には、JavaScript コードをトリガーするために使用できるイベントが関連付けられています。そのうち入力フィールドに関連するイベントは数多くあり、ユーザーが入力フィールドをクリックするか、タブ操作で移動した時点で、JavaScript コードがトリガーされるように focus イベントを関連付けることや、フォーカスが置かれた入力フィールドの外をクリックするか、タブ操作で入力フィールドから移動した時点で、JavaScript コードがトリガーされるように blur イベントを関連付けることもできます。イベントを関連付ければ、それによって実行できるアクションには限りがありません。例えば、blur イベントによって JavaScript コードをトリガーし、このコードで入力フィールドに有効なデータがあるかどうかをチェックして、有効なデータがない場合には自動フィードバックとしてメッセージをインラインで表示するという方法も採れます。以下のサンプル・コードで、focus イベントと blur イベントを使用して、入力フィールドにデフォルトのテキストを表示する方法を説明します。

<input type="text" name="email" value="Enter your email address" 
   onfocus="this.value = '';" onblur="if(this.value == '') 
   this.value = 'Enter your email address';" />

上記の入力フィールドにはデフォルト値が設定されているため、この入力フィールドがWeb ブラウザーに表示されると、フィールドには「Enter your email address (E メール・アドレスを入力してください)」というテキストが示されます。ユーザーがこの入力フィールドをクリックするか、またはタブ操作でこのフィールドに移動したときに、デフォルトのテキストを非表示にするには、focus イベントを使用してフィールドの値を空のストリングに設定します。ユーザーが入力フィールドの外をクリックするか、タブ操作で入力フィールドから離れたら、blur イベントを使用してデフォルト・テキストを再び表示します。ユーザーによってテキストが入力された場合には、そのテキストをそのまま残して表示します。

すべての HTML 要素には、その要素に関連付けられたイベントがあります。表 1 に、最もよく使用される HTML 要素とそれぞれに関連付けられているイベントの一例を記載します。

表 1. よく使用される要素とその要素に関連付けられているイベント
要素イベント
bodyonload, onunload
inputonfocus, onblur, onchange, onkeydown, onkeypress, onkeyup
formonsubmit
imgonmouseover, onmouseout, onclick

try...catch と throw

try...catch 文は、エラーをブラウザーに送信したり、カスタム・エラーを表示したりすることなく、コードのエラーをテストする手段となります。JavaScript のエラーが try...catch 文の try ブロック内に含まれていなければ、それに続く catch ブロック内の JavaScript コードは一切実行されず、エラーの処理および表示はブラウザー固有の方法に委ねられることになります。try...catch 文では、try ブロックで JavaScript コードを実行し、エラーが発生した場合は、catch ブロックでそのエラーを処理します。この構文を使用するのは、例えば特定のブラウザーでは機能しない可能性のあるコードを実行する場合です。そのようなコードが try...catch 文の try ブロックに含まれていて、エラーが返された場合、コードは実行されずに catch ブロックでエラーが処理されます。このエラー処理では、実際のエラー・メッセージを表示することもできれば、ユーザーがエラーの発生を知る必要があるかどうかによっては処理を省略することもできます。

try...catch を使用してエラーを処理する

try...catch 文の catch ブロックには、エラー・オブジェクトのデフォルト・パラメーターも組み込まれます。エラー・オブジェクトは、try ブロックで発生したエラーに関する適切な情報を返します。このエラー・オブジェクトには、messageline という 2 つのプロパティーがあります。message は、発生したエラーを正確に伝えるテキストを提供し、line はエラーが発生したコード行を正確に提供します。リスト 1 に、エラー・オブジェクトを使ってエラー・メッセージとエラーが発生した行をアラートする try...catch 文の例を記載します。もちろん、この情報が役立つのはデバッグの際だけですが、これらのプロパティーは、発生したエラーをブラウザーが処理するのに任せることなく、エラーに関するフィードバックをユーザーに提供しようとしている場合に役立つことがあります。

リスト 1. エラーのデバッグを目的に try...catch 文でエラー・オブジェクトを使用する
try
{
   // Attempt to execute code that produces an error here
}
catch(err)
{
   var txt = err.message +'\n';
   txt += err.line;
   alert(txt);
}

throw 文を使用して例外を発生させる

try...catch 構成体だけでも素晴らしいエラー処理機能を提供しますが、throw 文を使用することで、さらに高度な機能を提供することができます。throw 文では特定の条件に基づいて例外を発生させることができます。これは、正確でわかりやすい表現でユーザー・フレンドリーなエラー・メッセージを作成するには絶好の手段です。リスト 2 に、throw 文を使用して、try...catch 文の try ブロックに含まれる条件を基準に例外を発生させる単純な例を記載します。

リスト 2. throw文を使用して例外を発生させる
<script type="text/javascript">
var x=prompt("What type of music is Led Zeppelin?","");
try
{ 
   if(x != 'rock and roll')
   {
   throw "Err1";
   }
}
catch(er)
{
   if(er=="Err1")
   {
   alert("Sorry, you're wrong.");
   }
}
</script>

try、catch、throw はいずれも小文字で表記されることに注意してください。大文字を使用すると、JavaScript エラーが発生します。


JavaScript では、いくつかのタイプのポップアップ・ボックスを作成できるようになっています。そのうち最もよく使用されるタイプ (そして、このセクションで説明するタイプ) は、アラート・ボックス、確認ボックス、そしてプロンプト・ボックスです。

アラート・ボックス

本来の目的で使用されることはあまりありませんが、アラート・ボックスは、素早く簡単にページのエラーや警告などの重要なメッセージを表示する手段です。最近では、アラート・ボックスは JavaScript コードのデバッグ手段として最もよく使われており、未だに有効に利用されていると言えますが、アラート・ボックスを本来意図された目的で使用するのはベスト・プラクティスではありません。また、Mozilla Firefox、Apple Safari、または Google Chrome を使用している場合、デバッグには console.log ファイルをそのまま使用することができます。要するに、他のあらゆる手段が失敗した場合には、アラート・ボックスを有望な代替手段として使用できるということです。アラート・ボックスを作成するのは極めて簡単です。alert 関数を 1 行のコードとして入力して引数を渡すだけで、ウィンドウが開き、その渡された値がそこに表示されます。値としては、例えば単純なストリングを入力することができます。あるいは、alert 関数をデバッグに使用する好例として、変数の値を引数として渡し、アラート・ボックスにその値を表示することもできます。以下に、alert 関数を使用してアラート・ボックスを生成する基本的な方法を示します。

alert("This can be a variable or a simple text string");

確認ボックス

確認ボックスは、ユーザーが Web サイトで行った選択を確認するために使用します。Web アプリケーションの開発者であれば、ユーザーが自分のユーザー・アカウントを削除する選択をした場合、その選択について確認してから、ユーザーがリクエストの送信操作に進めるようにするのが賢明でしょう。

通常、confirm 関数は条件文に組み込まれ、ユーザーがその選択内容で処理を進める意思があるかどうかを確認してから、その答えに応じて JavaScript コードを実行するかどうかを決定します。以下は、条件文のなかで confirm 関数を使用して、JavaScript コードを実行するかどうかを決定する例です。

if(confirm("Click for a response"))
{
    alert('You clicked OK');
}
else
{
    alert('You clicked Cancel');
}

プロンプト・ボックス

ユーザーに質問を出して、回答させる簡単な方法を探しているとしたら、まさにプロンプト・ボックスがその必要を満たします。一般に、最近の Web 開発者はインライン・ポップアップ・ウィンドウをカスタムで作成するほうを選びますが、そうは言っても、特にデバッグの際にはプロンプト・ボックスが今でも現役で活躍しています。プロンプト・ボックスを生成するために使用する prompt 関数は、2 つの引数を取ります。1 つはカスタム・テキスト・ストリングで、通常このストリングには質問を指定するか、ユーザーに何らかの応答を促す文を指定します。もう 1 つの引数は、プロンプト・ボックスに表示するテキスト入力のデフォルト値として使用されるテキスト・ストリングです。このデフォルト値はオプションなので、実行時に変更することができます。以下に、prompt 関数を使用してユーザーに質問を出し、prompt 関数から返された値を使って、アラート・ボックスにユーザーの応答を表示する例を記載します。

var response=prompt("What is your favorite band?","Led Zeppelin");
if (response!=null && response!="")
{
   alert("response: "+ response);
}

cookie を使用する

cookie は、JavaScript コードが後でデータを取得して再利用できるように、データをクライアント・サイドに保存するためにあります。幅広く使用されるデータをユーザーのコンピューターに保存することには、多くの利点があります。例えばユーザーのエクスペリエンスをカスタマイズしたり、その前に実行されたアクションに応じて情報の表示方法を決定したりするなど、cookie はさまざまな目的で使用することができます。その一例は、後で Web サイトでの表示に使えるように、cookie を使用してサイトの訪問者の名前やその他の関連情報を保存するというものです。cookie は訪問者の Web ブラウザーに、名前と値のペア、失効日、そして送信先サーバーのドメインとパスが含まれるテキスト・ファイルとして保存されます。

cookie を作成するのは簡単です。保存する情報、保存期間、そして後で参照するための名前を決定するだけで、cookie を作成することができます。ただし、作成するのは簡単ですが、その構文には少し注意が必要です。cookie を適切に機能させるには、正しい構文にしなければなりません。以下のサンプル・コードに、cookie を作成してその中にデータを保存する方法の例を示します。

document.cookie =
  'cookiename=cookievalue; expires=Sat, 3 Nov 2001 12:30:10 UTC; path=/'

cookie に保存されるストリングの最初の部分、cookiename=cookievalue は、名前と値のペアです。このペアと 2 番目の部分は、セミコロン (;) で区切られます。ストリングの 2 番目の部分は正しいフォーマットで記述した失効日で、これに続くセミコロンで区切られた 3 番目かつ最後の部分はパスです。

cookie にデータを保存するには多少厄介な構文が必要ですが、後日、cookie の名前によって簡単にそこに保存されている値を取得することができます。以下に、名前を基準に cookie の値を取得する方法を示します。

alert(document.cookie);

上記のコードは、現行ドメインの cookie を取得しますが、ドメインには複数の cookie を保存することができます。その場合、document.cookie は配列となります。したがって、特定の cookie の値を取得するには、ターゲットを正しく指定しなければなりません。運のいいことに、リスト 3 のカスタム関数を使えば、cookie の名前をパラメーターとして渡すだけで、cookie の値を受け取ることができます。

リスト 3. 保存された cookie からのデータの取得
function getCookie(c_name)
{
var i,x,y;
var cookieArray = document.cookie.split(";");
for (i=0;i<cookieArray.length;i++)
{
  x = cookieArray[i].substr(0,cookieArray[i].indexOf("="));
  y = cookieArray[i].substr(cookieArray[i].indexOf("=")+1);
  x = x.replace(/^\s+|\s+$/g,"");
  if(x == c_name)
  {
	  return unescape(y);
	  }
	}
}
alert(getCookie('cookiename'));

ご覧のように、強力な関数を提供する cookie によって、サイトの訪問者のためにカスタム・エクスペリエンスを作成することも、あるいは単に、後日使用できるデータを保存することも可能になります。


タイミング

JavScript には、特定のアクションを実行するタイミングを制御および設定するための関数が用意されています。そのうち、最もよく使用されている関数には以下のものがあります。

  • setInterval
  • clearInterval
  • setTimeout
  • clearTimeout

setInterval 関数

場合によっては、ユーザーが操作をせずに JavaScript コードを繰り返し実行しなければならないことがあります。そのような場合に簡単に対処できるのが、setInterval 関数です。setInterval は 2 つの必須引数と、1 つのオプション引数を取ります。2 つの必須引数のうちの 1 つは、繰り返し実行する必要があるコードで、もう 1 つは、JavaScript コードを実行する間隔を定義するミリ秒です。3 つ目の引数はオプションで、code パラメーターによって実行される関数呼び出しに渡すために使用することができます。間隔に設定する期間をミリ秒で定義するのは、始めは少し慣れないかもしれません。つまり、1 秒ごとに実行する場合には 1000 ミリ秒を設定し、2 秒ごとに実行する場合には 2000 ミリ秒を設定します。表 2 に、setInterval 関数の各パラメーターとその役割を記載します。

表 2. setInterval 関数に使用できるパラメーター
パラメーター必須/オプション説明
code必須setInterval 関数が実行する JavaScript コード。このコードはカスタム・コードにすることも、関数呼び出しにすることもできます。
milliseconds必須コードの実行間隔 (ミリ秒単位)。
argumentオプションcode パラメーターとして関数を使用する場合、その関数に引数を渡すために使用できるパラメーター。

以下に示すのは、setInterval 関数を使用して 10 秒ごとに別の関数を実行し、その関数に引数を渡す方法のサンプル・コードです。引数の値は、実行される関数内で使用されます。この引数は、変数、オブジェクト、またはこのサンプル・コードでのように単純なテキスト・ストリングにすることができます。

setInterval(myFunction, 10000, 'sample');
function myFunction(myArg)
{
   alert('myFunction argument value: '+ myArg);
}

コードの繰り返しを終了するための関数もあります。

clearInterval 関数

コードの繰り返しを終了するために必要なのは、clearInterval 関数です。ただし、当初設定した間隔に変数名を割り当てることで、後から clearInterval で参照できるようにする必要があります。以下のサンプル・コードに、あらかじめ元の setInterval に対して設定された変数を clearInterval 関数で参照する方法を示します。

var myInterval = setInterval(myFunction, 10000, 'sample');
function myFunction(myArg)
{
   alert('myFunction argument value: '+ myArg);
   clearInterval(myInterval);
}

ご覧のように、変数を元の setInterval 関数に割り当て、myInterval という名前を設定しています。これで、後から myInterval を使用して setInterval 関数を参照し、設定されている変数の値を変更するか、または元の間隔を clearInterval 関数によって停止することができます。上記の関数は、最初の関数呼び出しで clearInterval 関数が実行されるため、1 度だけ呼び出されることになります。

setTimeout 関数

setTimeout 関数は、特定の時間制約に応じてコードや別の関数を実行できるという点で setInterval 関数に似ています。パラメーターまで setInterval と同じですが (表 2 を参照)、この 2 つの関数には大きな違いがあります。それは、setTimeout 関数はコードを繰り返し実行するのではなく、一度だけ実行するという点です。以下のサンプル・コードに、setTimeout 関数を使用して 10 秒後に関数を実行する方法を示します。

setTimeout(myFunction, 10000, 'sample');
function myFunction(myArg)
{
   alert('myFunction argument value: '+ myArg);
}

setTimeout は、特定のコードを実行する必要がある一方、すぐにはそのコードを実行したくない場合に役立ちます。この関数は、コードの実行を遅らせるには不可欠です。

clearTimeout 関数

何らかの理由で気が変わり、setTimeout で設定した期間を取り消さなければならない場合には、clearTimeout 関数がその役目を果たします。この場合、clearInterval 関数と同じく、setTimeout 関数に変数名を割り当て、後でそれを clearTimeout によって参照して実行中のタイマーを停止します。以下に記載するサンプル・コードに、clearTimeout を使用して setTimeout 呼び出しによって実行中のタイマーを停止する方法を示します。

var myTimeout = setTimeout(myFunction, 10000, 'sample');
function myFunction(myArg)
{
   alert('myFunction argument value: '+ myArg);
   clearTimeout(myTimeout);
}

上記では、元の setTimeout 関数に変数名を割り当て、myTimeout という名前を設定しています。これで、myTimeout を使用して setTimeout 関数を参照し、この関数によって実行中のタイマーを clearTimeout 関数を使用して停止することができます。


まとめ

JavaScript は、最もよく使用されているプログラミング言語の 1 つと言えます。その理由は、この記事を読んで明らかになったはずです。この単純ながらも充実したスクリプト言語には、実にさまざまな可能性があります。Web サイトの訪問者が Web ページをロードした後、そのページを操作できるようにするツールを提供しているという事実は強力です。この記事では、JavaScript 言語の基礎を理解する上でのベースを提供しました。次のステップとして、記事で説明した概念を実践に移し、JavaScript オブジェクトについてさらに詳しく調べてください。

参考文献

学ぶために

製品や技術を入手するために

  • JavaScript 言語の基礎を理解するに至ったら、jQuery ライブラリーを利用して開発を迅速化してください。
  • オープンソースのモジュール式 JavaScript ライブラリー、Dojo Toolkit は、特定のプラットフォームに依存しない JavaScript/Ajax ベースのアプリケーションおよび Web サイトを素早く開発するのに役立ちます。
  • IBM のソフトウェアを無料で試してみてください。試用版をダウンロードすることも、オンライン評価版にログインすることも、Sandbox 環境で製品を操作することも、クラウドを介して IBM 製品にアクセスすることもできます。100 を超える IBM 製品の評価版のなかから選ぶことができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=755523
ArticleTitle=JavaScript 言語入門: 第 2 回 イベント、cookie、タイミング、その他
publish-date=09092011