10.Javascriptのイベントとイベント処理
  オブジェクト指向プログラミングの多くは、イベント駆動型(イベントドリブン型)のプログラミングモデルが採用されており、
 Javascriptもこの方式が採用されています。
  Javascriptは、ブラウザから発生するいろいろなイベントを待っています。
  イベントには、以下のようなものがあります。
   ・ブラウザがドキュメントのダウンロードが完了したとき
   ・ユーザーがハイパーリンクやボタンを操作したとき
   ・キーボードを操作したとき
   など

   上記のようなイベントが発生するとそのイベントに対応したイベントハンドラが呼び出され、イベントを処理するようになります。
   このイベントをどのように処理するかは、プログラミングすることになります。
   イベントハンドらの書き方は、以下のものがあります。
   ①イベントハンドラをHTMLのタグ内に書く方法
   ②イベントハンドラメソッド
   ③イベントリスナー

 1)Javascriptのイベントハンドラの種類

   
イベントハンドラ イベントの内容
onBlur ページやフォーム要素からフォーカスが外れた時に発生
onFocus ページやフォーム要素にフォーカスが当たった時に発生
onChange フォーム要素の選択、入力内容が変更された時に発生
onSelect テキストが選択された時に発生
onSelectStart ページ内の要素が選択されようとした時に発生 ※IEのみ
onSubmit フォームを送信しようとした時に発生
onReset フォームがリセットされた時に発生
onAbort 画像の読み込みを中断した時に発生
onError 画像の読み込み中にエラーが発生した時に発生
onLoad ページや画像の読み込みが完了した時に発生
onUnload ウィンドウを閉じた時、他のページに切り替えた時、ページをリロード(更新)した時に発生
onClick 要素やリンクをクリックした時に発生
onDblClick 要素をダブルクリックした時に発生
onKeyUp 押していたキーをあげた時に発生
onKeyDown キーを押した時に発生
onKeyPress キーを押してる時に発生
onMouseOut マウスが離れたした時に発生
onMouseOver マウス乗った時に発生
onMouseUp クリックしたマウスを上げた時に発生
onMouseDown マウスでクリックした時に発生
onMouseMove マウスを動かしている時に発生
onDragDrop マウスでドラッグ&ドロップした時に発生 ※NN4のみ

 2)イベントハンドラをHTMLのタグ内に書く方法
   イベントハンドラをHTMLのタグ内に書きます。
   イベント処理プログラムを直接書こともできます。また、定義した関数を呼び出すこともできます。
  ①HTMLタグの中にイベントハンドラとその処理プログラムを書く方法
   <書式>
     <input type="button" value="クリック!" onClick="alert('クリックしたな!!');">

   <サンプル1>(ファイル名:js10-2-1-1.html)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HTMLタグの中にイベントハンドラとその処理プログラムを書く方法</title>
</head>
<body>
<input type="button" value="クリック!" onClick="alert('クリックしたな!!');">
</script>
</body>
</html>
  ②HTMLタグ内にイベントハンドラを書いて処理プログラムを関数に定義してその関数を呼び出す方法(戻り値がない場合)
   <書式>
     <input type="button" value="クリック!" onClick="func();">

   <サンプル2>(ファイル名:js10-2-2-1.html)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HTMLタグ内にイベントハンドラを書いて処理プログラムを関数に定義して関数を呼び出す方法</title>
<script type="text/javascript">
<!--
var z;
function func(x,y){
var z=2*x+3*y;
alert("計算結果:"+z);
}
// -->
</script>
</head>
<body>
<input type="button" value="クリック!" onClick="func(2,3);"> </body>
</html>
  ③関数リテラル(戻り値がある場合)
   <サンプル3>(ファイル名:js10-2-3-1.html)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>関数リテラル</title>
<body>
<script type="text/javascript">
<!-- var z;
var f=function(x,y){ var z=2*x+3*y;
return z; } z=f(1,1); //関数呼び出し
alert("計算結果:"+z);
// -->
</script> </head> </body>
</html>
 3)イベントハンドラメソッド方式
   この方法は、HTMLタグにイベントハンドラを埋め込まずにJavascript側でホームページからのイベントをすべて処理するようにします。
  ①「id」属性を持つエレメントをオブジェクトとして扱う方法
    ほとんどのタグに「id」属性をつけることができるので汎用性が高い。
    ただし、「id」属性は、一つのHTMLプログラムファイル内で属性の値が同じ値を持つことができない。
   <書式>
    ・getElementById("id属性の値")メソッドを使ってHTMLの「id」属性の値を取得し、オブジェクトとして返します。
    ・HTMLエレメントのオブジェクトの取得は、「window.onload」イベントハンドラメソッドに定義します。
    ・その他のイベントハンドラメソッドの定義も「window.onload」イベントハンドラメソッドに定義します。
    ・関数は、イベントハンドラメソッド内の書いても外に書いてもかまいません。
     window.onload=function(){ ← 各種イベントハンドラメソッドは、「windows.onload」イベントハンドラメソッドに定義します。
       var element1=document.getElementById("btn"); ← HTMLの「id」属性を持つエレメントをオブジェクトとして返しています。
       var element2=document.getElementById("txt"); ← HTMLの「id」属性を持つエレメントをオブジェクトとして返しています。
       element1.onclick=function(){ ← HTMLのエレメントをクリック時に実行するイベントハンドラメソッドを定義しています。
         element2.value=100; ← elment2オブジェクトのvalueプロパティに100を代入しています。(テキストフィールドに「100」が表示されます。)
         func(); ← 外部に定義した関数を呼び出しています。
       }
     }

     この方法でHTMLのエレメントをオブジェクトとして利用でき、属性やテキストはオブジェクトのプロパティとして参照することができます。

   <サンプル4>(ファイル名:js10-3-1-1.html)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>「id」属性を持つエレメントをオブジェクトとして扱う方法</title>
<script type="text/javascript">
<!--
window.onload=function(){
var element1=document.getElementById("btn");
var element2=document.getElementById("txt");
element1.onclick=function(){
element2.value=100;
func();
}
}
function func(){
alert("アラートでーす。");
}
// -->
</script>
</head> <body>
<input type="button" value="クリック!" id="btn">
<input type="text" id="txt">
</body>
</html>

  ② 「name」属性を持つエレメントをオブジェクトとして扱う方法
    「name」属性を付けることができるタグは<form>タグとその中のタグになります。フォームのエレメント処理には、よく使います。
   <書式>
    ・getElementsByName("name属性の値")メソッドを使ってHTMLの「name」属性の値を取得し、配列オブジェクトとして返します。
    ・HTMLエレメントのオブジェクトの取得は、「window.onload」イベントハンドラメソッドに定義します。
    ・その他のイベントハンドラメソッドの定義も「window.onload」イベントハンドラメソッドに定義します。
    ・関数は、イベントハンドラメソッド内の書いても外に書いてもかまいません。
     window.onload=function(){ ← 各種イベントハンドラメソッドは、「windows.onload」イベントハンドラメソッドに定義します。
       var element1=document.getElementsByName("btn"); ← HTMLの「name」属性を持つエレメントを配列オブジェクトとして返しています。
       var element2=document.getElementsByName("txt"); ← HTMLの「name」属性を持つエレメントを配列オブジェクトとして返しています。
       element1[0].onclick=function(){ ← HTMLのエレメントをクリック時に実行するイベントハンドラメソッドを定義しています。
         element2[0].value=100; ← elment2[0]オブジェクトのvalueプロパティに100を代入しています。(テキストフィールドに「100」が表示されます。)
         func(); ← 外部に定義した関数を呼び出しています。
       }
     }

     この方法でHTMLのエレメントをオブジェクトとして利用でき、属性やテキストはオブジェクトのプロパティとして参照することができます。

   <サンプル5>(ファイル名:js10-3-2-1.html)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>「name」属性を持つエレメントをオブジェクトとして扱う方法</title>
<script type="text/javascript">
<!--
window.onload=function(){
var elements1=document.getElementsByName("btn");
var elements2=document.getElementsByName("txt");
elements1[0].onclick=function(){
elements2[0].value=100;
func();
}
}
function func(){
alert("アラートでーす。");
}
// -->
</script>
</head> <body>
<form>
<input type="button" value="クリック!" name="btn">
<input type="text" name="txt">
</form>
</body>
</html>
  ③ タグ名で示されるエレメントをオブジェクトとして扱う方法
    指定された同じタグ名の要素をすべて配列オブジェクトとして返します。
   <書式>
    ・getElementsByTagName("タグ名")メソッドを使ってHTMLの同じタグ名をすべて取得し、配列オブジェクトとして返します。
    ・HTMLエレメントのオブジェクトの取得は、「window.onload」イベントハンドラメソッドに定義します。
    ・その他のイベントハンドラメソッドの定義も「window.onload」イベントハンドラメソッドに定義します。
    ・関数は、イベントハンドラメソッド内の書いても外に書いてもかまいません。
     window.onload=function(){ ← 各種イベントハンドラメソッドは、「windows.onload」イベントハンドラメソッドに定義します。
       var elements=document.getElementsByTagName("input"); ← HTMLのエレメントの<input>タグを配列オブジェクトとして返しています。
       elements[0].onclick=function(){ ← HTMLのエレメントをクリック時に実行するイベントハンドラメソッドを定義しています。
         elements[1].value=100; ← elment[1]オブジェクトのvalueプロパティに100を代入しています。(テキストフィールドに「100」が表示されます。)
         func(); ← 外部に定義した関数を呼び出しています。
       }
     }

     この方法でHTMLのエレメントをオブジェクトとして利用でき、属性やテキストはオブジェクトのプロパティとして参照することができます。

   <サンプル5>(ファイル名:js10-3-3-1.html)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>タグ名で示されるエレメントをオブジェクトとして扱う方法</title>
<script type="text/javascript">
<!--
window.onload=function(){
var elements=document.getElementsByTagName("input");
elements[0].onclick=function(){
elements[1].value=100;
func();
}
}
function func(){
alert("アラートでーす。");
}
// -->
</script>
</head> <body>
<form>
<input type="button" value="クリック!">
<input type="text">
</form>
</body>
</html>
  ④ 「class」属性で示されるエレメントをオブジェクトとして扱う方法
    ほとんどのタグに「class」属性をつけることができるので汎用性が高い。
    「class」属性は、一つのHTMLプログラムファイル内で属性の値が同じ値を持つことができる。
   <書式>
    ・getElementsByClassName("class属性の値")メソッドを使ってHTMLの「class」属性の値を取得し、オブジェクト配列として返します。
    ・HTMLエレメントのオブジェクトの取得は、「window.onload」イベントハンドラメソッドに定義します。
    ・その他のイベントハンドラメソッドの定義も「window.onload」イベントハンドラメソッドに定義します。
    ・関数は、イベントハンドラメソッド内の書いても外に書いてもかまいません。
     window.onload=function(){ ← 各種イベントハンドラメソッドは、「windows.onload」イベントハンドラメソッドに定義します。
       var element1=document.getElementsByClassName("btn"); ← HTMLの「class」属性を持つエレメントをオブジェクトとして返しています。
       var element2=document.getElementsByClassName("txt"); ← HTMLの「class」属性を持つエレメントをオブジェクトとして返しています。
       element1[0].onclick=function(){ ← HTMLのエレメントをクリック時に実行するイベントハンドラメソッドを定義しています。
         element2[0].value=100; ← elment2オブジェクトのvalueプロパティに100を代入しています。(テキストフィールドに「100」が表示されます。)
         func(); ← 外部に定義した関数を呼び出しています。
       }
     }

   <サンプル5>(ファイル名:js10-3-4-1.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>「name」属性を持つエレメントをオブジェクトとして扱う方法</title>
<script type="text/javascript">
<!--
window.onload=function(){
var elements=document.getElementsByClassName("element");
elements[0].onclick=function(){
elements[1].value=100;
func();
}
}
function func(){
alert("アラートでーす。");
}
// -->
</script>
</head> <body>
<form>
<input type="button" value="クリック!" class="element">
<input type="text" class="element">
</form>
</body>
</html>
   この方法でHTMLのエレメントをオブジェクトとして利用でき、属性やテキストはオブジェクトのプロパティとして参照することができます。
   この「getElement・・・」メソッドは DOMと呼ばれるモデルで定義されています。詳しくは、ここを参照してください。

<課題1>
  イベントハンドラメソッドを使って以下のような計算をするプログラムを作ってください。
   
   
    ×
    ÷

<課題2>
  イベントハンドラメソッドをるかって特定のタグに囲まれたテキストを変更するプログラムを作ってください。
  <div>もう6月だというのに寒いぐらいですね。</div>
                ↓                      
  <div>暑くなったらなったで、暑いなーってなるけどね。</div>

 4)イベントリスナ方式
   イベントリスナ方式は、イベントリスナが追加されたオブジェクトのみイベントを監視するようになります。
   イベントハンドラやイベントハンドラメソッドの場合は、同じイベントに対しては、一つのイベントハンドラしか書けない欠点があります。
   しかし、イベントリスナー方式は、追加したイベントリスナを削除して別のイベントリスナを追加することができます。
   したがって、同じイベントに対して別のリスナ関数を追加することができます。

  ①イベントリスナを追加する方法
   a.InernetExplorerの場合

     オブジェクト名.attachEvent(イベントハンドラ名,関数名);

      オブジェクト名:通常は、HTMLのエレメントが対象になります。
               オブジェクト名=getElementById("id名")などでHTMLのエレメントをオブジェクト化します。

      イベントハンドラ名:イベントを受け取るハンドラ名を書きます。(全て半角小文字で書きます。)
                  イベントハンドラ名の頭に「on」がつきます。(たとえば、onclickとなるので注意が必要です。)

      関数名:イベントが発生したときに呼び出す関数の関数名を書きます。

   b.InernetExplorer以外の場合

     オブジェクト名.addEventListener(イベントハンドラ名 ,関数名,イベント伝搬優先の有無);

      オブジェクト名:通常は、HTMLのエレメントが対象になります。
               オブジェクト名=getElementById("id名")などでHTMLのエレメントをオブジェクト化します。

      イベントハンドラ名:イベントを受け取るハンドラ名を書きます。(全て半角小文字で書きます。)
                  イベントハンドラ名の頭に「on」がつきません。(たとえば、clickとなるので注意が必要です。)

      関数名:イベントが発生したときに呼び出す関数の関数名を書きます。

      イベント伝搬優先の有無:
         「false」:オブジェクトの階層で下層(孫)から上層(親:ルート)に向かってイベントが伝搬されます。
         「true」:「true」が指定さてているイベントリスナの下層にあるオブジェクトからイベントが発生しても「true」が設定された
              階層でイベントが発生します。
         InertnetExplorerは、この機能がないので特に必要がない場合は、「false」 にしておきます。

  ②イベントリスナを削除する方法
   a.InernetExplorerの場合

     オブジェクト名.detachEvent(イベントハンドラ名,関数名);

      オブジェクト名:イベントリスナを追加したときのオブジェクト名

      イベントハンドラ名:イベントリスナを追加した時のイベントハンドラ名(全て半角小文字で書きます。)
                  イベントハンドラ名の頭に「on」がつきます。(たとえば、onclickとなるので注意が必要です。)

      関数名:イベントリスナを追加したときの関数名を書きます。

   b.InernetExplorer以外の場合

     オブジェクト名.removeEventListener(イベントハンドラ名 ,関数名,イベント伝搬優先の有無);

      オブジェクト名:イベントリスナを追加したときのオブジェクト名

      イベントハンドラ名:イベントリスナを追加した時のイベントハンドラ名(全て半角小文字で書きます。)
                  イベントハンドラ名の頭に「on」がつきません。(たとえば、clickとなるので注意が必要です。)

      関数名:イベントリスナを追加したときの関数名を書きます。

      イベント伝搬優先の有無:イベントリスナを追加したときのイベント伝搬優先の有無を書きます。

  ③イベントリスナー追加のサンプル
    <ファイル名:js10-4-3-1.html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>イベントリスナ追加のサンプル</title>
<script type="text/javascript">
<!--
setEventListener(window,"load",window_onLoad); //ドキュメントロード時にwindow_onLoad()関数が実行できるようにイベントリスナを追加している。
//必ず一番最初に書きます。
//このようにすることでwindow_load()関数がドキュメントロード時に実行されるようになります。 function setEventListener(obj,event,func){ //イベントリスナを追加のための関数
if(navigator.appName.indexOf("Microsoft")>-1){ //InternetExplorerは「0」、それ以外のブラウザは、「-1」を返す。
obj.attachEvent("on"+event,func); //InternetExplorerの場合のイベントリスナの追加
}
else{
obj.addEventListener(event,func,false); //InternetExplorer以外のブラウザのイベントリスナの追加
}
}
function window_onLoad(){
btn=document.getElementById("btn"); //HTMLのエレメント(ボタン)のオブジェクト化
txt=document.getElementById("txt"); //HTMLのエレメント(テキストフィールド)のオブジェクト化
setEventListener(btn,"mousedown",button_mouseDown); //[btn]オブジェクト上でマウスダウンしたときにbutton_mouseDown()関数を呼び出す
//イベントリスナの追加
setEventListener(btn,"mouseup",button_mouseUp); //[btn]オブジェクト上でマウスアップしたときにbutton_mouseUp()関数を呼び出す
//イベントリスナの追加
setEventListener(btn,"mouseover",button_mouseOver); //[btn]オブジェクト上でマウスオーバしたときにbutton_mouseOver()関数を呼び出す
//イベントリスナの追加
setEventListener(btn,"mouseout",button_mouseOut); //[btn]オブジェクト上でマウスアウトしたときにbutton_mouseOut()関数を呼び出す
//イベントリスナの追加
}
function button_mouseDown(){ //[btn]オブジェクト上でマウスダウンしたときに呼び出される関数。
txt.value="マウスボタンを押してるね!";
btn.value="マウスボタン押下中";
}
function button_mouseUp(){ //[btn]オブジェクト上でマウスアップしたときに呼び出される関数。
txt.value="マウスボタンを離したな!";
btn.value="マウスボタン離した";
}
function button_mouseOver(){ //[btn]オブジェクト上でマウスオーバしたときに呼び出される関数。
txt.value="マウスポインタを入れたな!";
btn.value="マウスポインタが入りました";
}
function button_mouseOut(){ //[btn]オブジェクト上でマウスアウトしたときに呼び出される関数。
txt.value="マウスポインタを出したな!";
btn.value="マウスポインタが出ました";
}
// -->
</script>
</head>
<body>
<form>
<input type="button" value="マウスオーバしてね!" name="btn" id="btn">
<input type="text" name="txt" id="txt">
</form>
</body>
</html>
  ④ イベントリスナー削除のサンプル
    <ファイル名:js10-4-4-1.html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>イベントリスナー削除のサンプル</title>
<script type="text/javascript">
<!--
setEventListener(window,"load",window_onLoad);
function setEventListener(obj,event,func){
if(navigator.appName.indexOf("Microsoft")>-1){
obj.attachEvent("on"+event,func);
}
else{
obj.addEventListener(event,func,false);
}
}
function resetEventListener(obj,event,func){ //イベントリスナを削除する関数
if(navigator.appName.indexOf("Microsoft")>-1){
obj.detachEvent("on"+event,func); //InternetExplorerの場合のイベントリスナの削除
}
else{
obj.removeEventListener(event,func,false); //InternetExplorer以外のブラウザのイベントリスナの削除
}
}
function window_onLoad(){
btn=document.getElementById("btn");
txt=document.getElementById("txt");
ilClear=document.getElementById("ilClear");
setEventListener(btn,"mousedown",button_mouseDown);
setEventListener(btn,"mouseup",button_mouseUp);
setEventListener(btn,"mouseover",button_mouseOver);
setEventListener(btn,"mouseout",button_mouseOut);
setEventListener(ilClear,"click",listener_clear);
}
function button_mouseDown(){
txt.value="マウスボタンを押してるね!";
btn.value="マウスボタン押下中";
}
function button_mouseUp(){
txt.value="マウスボタンを離したな!";
btn.value="マウスボタン離した";
}
function button_mouseOver(){
txt.value="マウスポインタを入れたな!";
btn.value="マウスポインタが入りました";
}
function button_mouseOut(){
txt.value="マウスポインタを出したな!";
btn.value="マウスポインタが出ました";
}
function listener_clear(){ //イベントリスナを削除しています。
resetEventListener(btn,"mousedown",button_mouseDown);
resetEventListener(btn,"mouseup",button_mouseUp);
resetEventListener(btn,"mouseover",button_mouseOver);
resetEventListener(btn,"mouseout",button_mouseOut);
resetEventListener(btn,"click",listener_clear); alert("全てのイベントリスナが削除されました。");
}
// -->
</script>
</head>
<body>
<form>
<input type="button" value="マウスオーバしてね!" name="btn" id="btn">
<input type="text" name="txt" id="txt">
<input type="button" value="イベントリスナ削除" id="ilClear"> </form>
</body>
</html>