DOMへのイベント割り当て(イベントリスナ)

これまでは、ボタンがクリックされたときにclick_func()という関数を実行する場合、onclick要素を使ってきた。

<button onclick="click_func();">ボタン</button>

これをイベントハンドラ式と呼ぶ。しかし、最近ではajax化が進みこの方法だと、関数の競合が起こりやすくなってきた。また、HTMLソースの見た目も悪くなる上、外部スクリプト化したときに正常に作動しないケースが多くなる。

そこで、onload時に命令を割り当ててしまおうという方法が最近のJavaScriptのプログラミングにおいて一般的となっている。onloadに関する情報は、../onloadイベントを参照。これをイベントリスナ式と呼ぶ。

通常

これは、フレームワークを用いない通常の方法

形式は、 addListener(要素のIDなど,イベントのタイプ(click,mouseoverなど),実行したい関数)となる。

var addListener = function(elm, type, func) {
	if(! elm) { return false; }
	if(elm.addEventListener) { /* W3C準拠ブラウザ用 */
		elm.addEventListener(type, func, false);
	} else if(elm.attachEvent) { /* Internet Explorer用 */
		elm.attachEvent('on'+type, func);
	} else {
 		return false;
	}
	return true;
};

これを用いることによって、HTML部は

<button id="btn">ボタン</button>

となり、実際スクリプトを記述する部分は、後述する通常の方法では、さきほどのスクリプトの直下に

addListener(document.getElementById('btn'), "click", click_func);

のように記述し、分離することが可能になる。

prototype.jsの場合

prototype.jsの場合は、Event.observeで割り当て。$('...')は、document.getElementById('...')のショートカット。

Event.observe($('btn'), 'click', click_func);

dojoの場合

基本的に以下のようになる。

dojo.byId('btn')connect('onclick',click_func);

ただし、dijitなどで装飾しているフォームなどの場合は、

dijit.byId('btn').connect('onclick',click_func);

のように、dojo.byIdが使えない場合があるので注意。

または、CSSセレクタを用いて、

dojo.query('#btn').connect('onclick',click_func);

という指定方法も可能である。

jQueryの場合

jQueryの場合はもっと簡単。基本的にid属性でアクセスという概念が無く、すべてCSSセレクタで指定する。

つまり、$()に入る要素の指定方法は、CSSで言うIDの指定方法と同じだ。dojoで言うところのすべてがdojo.query()とみなしてよい。

$("#btn").click(click_func);

uupaa-jsの場合

uu.event.set(null,uu.id('btn'),'click',false)