メインコンテンツまでスキップ

イベント

としての関数

JavaScript では、 関数の一種です。したがって、他の と同じように、 変数代入したり、 関数 引数 戻り値 として使用したりすることができます。

function greet() {
document.write("Hello World");
}

const func = greet;
func();

上の例では、 const func = greet; の行で変数 func関数 greet代入しています。関数として扱うときは、関数呼び出しの括弧は使用しません。これにより、関数代入された変数を経由してその関数を実行できます。

イベントハンドラ

オブジェクトプロパティとして 関数を利用することもできます。document.getElementById が返す オブジェクトonclick プロパティ には、 要素がクリックされたときに実行される 関数を指定できます。

ボタンのクリック、フォームへの入力、ページの読み込みなど、Web ページ上で発生するあらゆるアクションを総称してイベントと呼びます。 このようなイベントの処理を行うのがイベントハンドラで、onclick 関数はその一例です。

index.html
<button id="greet-button" type="button">クリック</button>
script.js
function clicked() {
document.write("Hello World");
}

const greetButton = document.getElementById("greet-button");
greetButton.onclick = clicked;

この例では、HTML 要素id 属性greet-button が指定されている HTML 要素を表すオブジェクトonclick プロパティに対し、関数 clicked代入しています。これにより、ボタンがクリックされたとき、clicked 関数が実行されるようになります。

備考

下のコードは意図したとおりに動作しません。何が間違っているのでしょうか。

function clicked() {
document.write("Hello World");
}

const greetButton = document.getElementById("greet-button");
greetButton.onclick = clicked();

答えは、最後の行が clicked から clicked() に変わってしまっていることです。関数は、カッコをつけた評価されるタイミングで実行されます。このため、

greetButton.onclick = clicked();

では代入より前、 clicked()評価されたタイミングで clicked 関数が実行されてしまいます。

注意

上の例では、画面上にはじめから表示されていたボタンが、ボタンをクリックしたときに削除されています。これは、 document.write をすべての要素の表示が終わった後に実行すると、画面上のすべての要素を一度削除するという挙動をとるためです。このため、現代の JavaScript において、 document.write 関数が使用されることはほとんどありません。

課題

押すと大きく赤文字が表示される「びっくり箱」のようなボタンを作ってみましょう。

ヒント1:文字列の表示

さっきは文字列の表示にdocument.write() を使いましたが、これでは文字色やサイズが変えられません。 こんな書き方ならそれもできますが、あまりに乱暴ですよ。

document.write("<div style='color:red; font-size:40px'>Hello world!</div>");

HTML 要素をJavaScriptで操作する方法は前回の「DOM」の章で扱っています。

ヒント2:HTMLファイルに…

<button> タグのHTML属性を書き換えるとボタンの中にHello world! を表示してしまいます。

HTMLファイルに一工夫が必要です。空の<div> タグを用意してあげましょう。

<div id="greeting"></div>