ウィンドウシステムのような
GUI(Graphical User Interface)
を利用するプログラムでは,
マウスクリック,ドラッグ,キー入力などの操作の事象(イベント)を監視し,
イベントが発生すると,それに対応した処理を行う仕組みが組み込まれている.
マウスクリックなどの事象をイベントと呼び, イベント発生に対応して行う処理コードをイベントハンドラと呼ぶ.
上の例では,head部分を省略し,body部分のみを示している.
imgタグに
この画像がクリックされると,関数 clickAction を呼び出す
引数として,イベント情報が保持されているオブジェクト event を渡す
マウスカーソルがこの画像の外に出ると document の背景色を白にする
マウスカーソルがこの画像領域内に入ると document の背景色を緑にする
関数 clickAction の定義
function clickAction(e) { alert("押されたボタンのコード: "+ e.button); }
上の例では,head部分を省略し,body部分のみを示している.
このページ内でマウスを動かした場合に発生するイベントに対して, 関数 mouseEvent を呼び出すことを定義している.
JavaScript内より参照する目的で,
divタグに識別子名を設定している.
次の
function mouseEvent(e) { var label = document.getElementById("labelDiv"); var textNode = label.childNode.item(0); textNode.nodeValue = "x="+e.clientX+", y="+e.clientY; }
getElementByIdにより,boby内のタグ
<div id="labelDiv"> 〜 </div>を参照している
変数 label に divタグ(labelDiv)のオブジェクトを格納している.
この変数を介して,labelDivの属性にアクセスが可能となる
labelのchildNodes 属性より,配列で与えられる ノードリストより, メソッド item(0) を介して子ノードであるテキスト領域を取得し, そのオブジェクトを変数 textNode に格納している.
nodeValue 属性よりテキストにアクセスして, その値を変更している.
<div id="labelDiv"> 〜 </div>で表示されるページの内容(文字列)が変更される
e.clientX, e.clientYは発生したイベント(mouseMove)が保持するマウス位置
onmousemoveイベント
divタグ内のテキストの変更
上の例では,head部分を省略し,body部分のみを示している.
フォーム(FORM)はWebページへのデータの入力に使用される.
FORMはHTMLと利用者との対話を可能とするためのもので, テキストなどの入出力,ボタン,リスト選択などの機能を提供する.
次はフォームの例である.
FORMタグ
<form name="myForm"> ... </form>
<input type="text" name="textBox" />
name属性をtextBoxとしている. JavaScriptからはこの名前でアクセス可能
<input type="button" value="クリック" onclick="alert(myForm.textBox.value)">
このボタンが押されたときにalertダイアログが開く.
ダイアログ内に表示される内容は,属性値 myForm.texBox.value
(myFormフォーム内のtextBoxの持つvalue属性の値)
次はフォームとイベントの例である. BODY部のみを示す.
<input type="text" name="inch" size="10">
<input type="button" name="calcButton" value="変換" oncllick="calc(this.form)">
<input type="radio" name="color" value="white" checked>白<br> <input type="radio" name="color" value="yellow">赤<br> ...
<input type="button" name="colorButton" value="変更" onclick="changeColor()">このボタンが押されたときに呼び出される関数 changeColor()
function changeColor() { var n; var colors = document.myForm.color; // ラジオボタン color (配列) for(n=0; n<colors.length; n++) { if(colors[n].checked) { // このボタンがチェックされているか? if(confirm("背景色を"+colors[n].value+"にしますか?")) document.bgColor = colors[n].value; break; } } }
function calc(theForm) { theForm.inch.value = theForm.cm.value / 2.56; }
selectタグ
複数選択可能
<form name="question1"> 好きなたべものを選んで下さい(複数選択可)<br> <input name="f" type="checkbox" value="ラーメン">ラーメン<br> <input name="f" type="checkbox" value="そば">そば<br> <input name="f" type="checkbox" value="うどん">うどん<br> <input name="f" type="checkbox" value="カレー">カレー<br> <input name="f" type="checkbox" value="牛丼">牛丼<br> <input name="f" type="checkbox" value="ハンバーガー">ハンバーガー<br> </form>
イベント属性 | イベントの発生 | オブジェクト |
---|---|---|
onClick | マウスクリック | |
onDblClick | マウスをダブルクリック | |
onMouseDown | マウスボタンが押された | |
onMouseUp | マウスボタンが離された | |
onMouseOver | マウスカーソルが入った | |
onMouseOut | マウスカーソルが出た | |
onMouseMove | マウスカーソルが動いた | |
onKeyDown | キーが押された | |
onKeyUp | キーが離された | |
onKeyPress | キーが押された | |
onLoad | ページがロードされた | <body> |
onUnLoad | 他のページに切り替わる | <dody> |
onReset | リセットボタンが押された | <form> |
onSubmit | サブミットボタンが押された | <form> |
onChange | 値が変化した | <input>, <select>, <textarea> |
onSelect | テキストが選択された | <input>, <textarea> |
onFocus | 選択された | <a>, <area> 他 |
onBlur | Focusが解除された | <a>, <area> 他 |
shiftキーやcontrolキーが押された場合,onKeypDownイベントは発生するが, onKeyPressイベントは発生しない.
上のリストでは<body>〜</body>のみを示す
いくつかのオブジェクトについて, メソッドと属性の抜粋を以下に示す.
メソッド | 内容 |
---|---|
write() | HTML文章にテキストを出力する |
getElementById(ID値) | 指定したID値を持つ要素(Element)を返す |
getElementsByTagName(タグ名) | 「タグ名」に一致する要素のリスト(NodeList)を返す |
createTextNode(文字列) | 「文字列」を値として持つテキストノードを生成する |
createElement(タグ名) | 要素を生成する |
属性 | 内容 |
---|---|
title | titleタグの内容(変更可能) |
referre | 直前のページのURL |
domain | サーバのドメイン名 |
URL | このページのURL |
属性 | 内容 |
---|---|
length | NodeListの要素数 |
parentNode | 親ノード |
childNodes | 子ノードのリスト |
nodeValue | ノードの値 |
メソッド | 内容 |
---|---|
item(n) | n番目の要素(Node)を返す |
var list = document.getElementsByTagName("table"); var firstTable = list.item(0);
属性 | 内容 |
---|---|
nodeName | 要素名、あるいは、属性名 |
nodeType | node型に対応した整数値 |
メソッド | 内容 |
---|---|
appendChild(ノード) | ノードを追加する |
removeChild(ノード) | ノードを削除する |
|
|
ElementはNodeを継承しており,
getElementsByTagName(タグ名).item(番号)で返される Node を Element として扱うことができる.
属性 | 内容 |
---|---|
tagName | タグ名 |
メソッド | 内容 |
---|---|
getAttribute(属性名) | 指定した属性の値を返す |
setAttribute(属性名, 属性値) | 指定した属性の値をセットする |
<body> <div>first</div> <div align="right" style="background-color:yellow;">second</div> <script type="text/javascript"> var elements=document.getElementsByTagName("div"); var n; alert("divの総数"+elements.length); for(n=0; n<elements.length; n++) { var element = elements.item(n); document.write("<p>", n, "<br>"); document.write("タグ名 = ",element.tagName,"<br>"); document.write("align = ", element.getAttribute("align"),"<br>"); document.write("style = ", element.getAttribute("style"),"<br>"); document.write("</p>"); element.setAttribute("align","center"); } </script> </body>
上の例では,head部分を省略し,body部分のみを示している.
次のウェブページを作成しなさい.
JavaScriptでは,比較演算子( ==, !=, < <= など) を用いて数値の他に文字列の大小も比較をすることもできる (文字コードが比較される).
フォームに4つのテキストボックスと1つのボタンを配置し, 次のような動作をするページを作成せよ.
フォームを利用して,入力された数式を文字列として受け取り, その計算結果を表示するページを作りなさい.