トップページ >  jQuery >  DOMイベントへの対応
初版2011/10/18: 最終更新日2011/10/18
DOMイベントへの対応
目次
DOMイベントへの対応
基本的なイベント
jQuery.Event
イベントハンドリング
イベントヘルパー
DOMイベントへの対応

WEBアプリケーションを作成する上で、重要なのはインターラクティブに画面や状態を変化させることです。
画面や状態を変化させる際、ユーザーからの指示を受け取る必要があります。
Javascriptでは、「onClick」などのDOMイベントを定義することで対応することが可能です。
しかし、要素毎に属性としてイベントを定義することは大変手間ですし、似た要素に大量に適用する場合には不向きです。
また、addEventListenerメソッドなどでまとめて設定することも可能です。
しかし、addEventListenerメソッドなどは、使い方が結構難しく、またIEなどブラウザによっては別のメソッドを使う必要があります。

リスト1. DOMでのイベントの追加例

var eventTarget = document.getElementById("foge");
// リスナーの追加
if(eventTarget.addEventListener){
	// DOM Level2 Event Modelサポートブラウザ(FireFoxなど)
	eventTarget.addEventListener("click", fogeClicked, false);
}else if(eventTarget.attachEvent){
	// MS-IE
	eventTarget.attachEvent("onclick", fogeClicked);
}
※実例はありません。

jQueryは、イベントの取り扱いも簡潔にしています。
また取り扱い方はブラウザに依存しません。
CSSセレクタを使えるので、大量のイベント制御も簡単です。
コールバック関数(匿名関数を含む)を用いますので、グローバル名前空間での衝突を避けた安全なコードを書くことが出来ます。

リスト2. jQueryでのイベントの追加例

jQuery('#foge').click(fogeClicked);
※実例はありません。
基本的なイベント

最も基本的なイベントは、「ページ読み込み時」の処理です。
jQueryでスクリプトを定義する上で、最も使われるメソッドです。

ready(コールバック関数)
DOMがロードされて操作・解析が可能になったタイミングで コールバック関数 を実行します。
DOMの準備段階で処理を実行したいと考えることが多いと思います。
しかし、window.onload では画像などのロード完了時にタイミングを合わせるブラウザがあります。
readyイベントを用いることで、アプリケーションの体感処理速度を大きく向上させることができます。
このメソッドを使う場合、bodyのonloadイベントには何も書かないようにしてください。
onloadイベントが適用され、readyイベントが実行されなくなってしまいます。
このメソッドは、body要素に限らず用いることができます。
ドキュメントオブジェクトの用意ができた時点に実行したい場合は、「jQuery(document).ready(...)」で定義できます。
複数の定義した場合、登録した順に実行されます。
返り値:jQueryオブジェクト

リスト3. ready(コールバック関数)

// ドキュメント準備完了時の処理
var clockTimer;
jQuery(document).ready(function(){
	// 1秒おきにmyClock()関数を実行
	clockTimer = window.setInterval( myClock, 1000);
});

実装例

ここ「」に現在時刻が表示されていると思います。
これは、ドキュメントが読み込まれた段階で定義されたものです。

jQuery.Event

jQueryの専用イベントオブジェクトです。
jQueryのイベントシステムは、W3C標準に準拠しています。
イベント系jQueryのメソッドにおいては、コールバック関数の第1引数として渡されます。
イベントオブジェクトはjQueryのイベントハンドラーに対応します。
ブラウザの仕様に依存しないので、window.eventなどから取得する必要もありません。
元となるイベントオブジェクトのプロパティのほとんどは、このオブジェクトに複製されます。

jQuery.Eventクラス
jQuery.Eventオブジェクトは、コンストラクタが公開されています。
(下述の「trigger」メソッドなどで用いられます。)
コンストラクタでありますが、new ステートメントはなくても可能です。
返り値:jQuery.Eventオブジェクト

リスト4. jQuery.Eventクラス

// new付きで定義
var e = new jQuery.Event("click");

// new無しで定義
var e = jQuery.Event("click");
 
jQuery.Event.type
イベントの種類を表す文字列です。

リスト5. jQuery.Event.type

jQuery('#Sample35').click(function(evt){
	alert('イベントの種類:' + evt.type );
});
 
jQuery.Event.target
イベント処理の対象となるDOM要素です。
ブラウザに依存しません。

リスト6. jQuery.Event.target

jQuery('#Sample36').click(function(evt){
	var target = evt.target;
	alert('イベント対象:' + target.tagName + '#' + target.id + '.' + target.className );
});
 
jQuery.Event.relatedTarget
マウス移動系のイベントにおいて、該当要素にマウスが乗る直前に示していた要素、或いはマウスが出て行って乗った要素を返します。
ブラウザに依存しません。

リスト7. jQuery.Event.relatedTarget

jQuery('#Sample37').mouseout(function(evt){
	var target = evt.relatedTarget;
	alert('イベント対象:' + target.tagName + '#' + target.id + '.' + target.className );
});
マウス範囲
 
jQuery.Event.currentTarget
イベントのバブリングが行われている際に、ポインタが現在示している要素を返します。
これはすなわち、イベントハンドラ内のthisと同じ要素を指すことになります。

リスト8. jQuery.Event.currentTarget

jQuery('.Sample38').click(function(evt){
	var target = evt.currentTarget;
	alert('イベント対象:'
	     + target.nodeName
	     + '\n'
	     + '実際の対象は' + evt.target.nodeName );
});
ここをクリックしてください。
ここでも 構いません。
 
jQuery.Event.pageX
jQuery.Event.pageY
pageXおよびpageYは、文書内の相対座標を示します。

リスト9. jQuery.Event.pageX/pageY

jQuery('.Sample39').click(function(evt){
	alert('X=' + evt.pageX
	     + '\n'
	     + 'Y=' + evt.pageY );
});
 
jQuery.Event.result
イベントハンドラより返された、最後の値です。
undefinedにはなりません

リスト10. jQuery.Event.result

jQuery('#Sample310').click(function(evt){
	return '1st:' + evt.timeStamp;
});
jQuery('#Sample310').click(function(evt){
	alert( evt.result + '\n2nd:' + evt.timeStamp);
});
 
jQuery.Event.timeStamp
イベントが作成された時間を返します。
精度はミリ秒単位です。

リスト11. jQuery.Event.timeStamp

var last;
jQuery('#Sample311').click(function(evt){
	var str = '今回:' + evt.timeStamp ;
	if(last){
		str = str + '\n' + '前回:' + last;
	}
	last = evt.timeStamp;
	alert(str);
});
 
jQuery.Event.preventDefault()
ブラウザが最初から持っているアクションを中断させる場合に用います。
イベントオブジェクトに対して、既にこのイベントが呼ばれているかを確認するには、isDefaultPrevented()メソッドを使います。

リスト12. jQuery.Event.preventDefault()

jQuery('#Sample312').click(function(evt){
	alert('ジャンプ中止');
	evt.preventDefault();
});
jQuery HOMEへ
 
jQuery.Event.isDefaultPrevented()
既にevent.preventDefault()が呼ばれているかを返します。

リスト13. jQuery.Event.isDefaultPrevented()

jQuery('#Sample313').click(function(evt){
	last = evt.timeStamp;
	evt.preventDefault();
});
jQuery('#Sample313').click(function(evt){
	if( evt.isDefaultPrevented()){
		alert('1度' + last + 'に中止しました');
	}
	else
	{
		alert('今、ジャンプを中止しました');
		evt.preventDefault();
	}
});
jQuery HOMEへ
 
jQuery.Event.stopPropagation()
イベントのバブリングを中止します。
イベントの発生通知は親の要素に伝播していきますが、それを止めてしまうのがこのメソッドです。
ただ、このメソッドは同じ要素の他のハンドラへのイベント通知は妨げません。
このメソッドが呼ばれたハンドラより後に登録された他のコールバック関数も、全て呼び出されることになります。
これはtriggerで呼び出されるカスタムイベントであっても同様です。
このメソッドが既に呼び出されているかどうかを知るには、isPropagationStopped()メソッドを用います。

リスト14. jQuery.Event.stopPropagation()

jQuery('.Sample314a button').click(function(evt){
	alert( this.tagName);
});
jQuery('.Sample314b button').click(function(evt){
	alert( this.tagName);
	evt.stopPropagation();
});
jQuery('.Sample314a,.Sample314b').click(function(evt){
	alert( this.tagName);
});
 
jQuery.Event.isPropagationStopped()
イベントのバブリングを中止します。
イベントの発生通知は親の要素に伝播していきますが、それを止めてしまうのがこのメソッドです。
ただ、このメソッドは同じ要素の他のハンドラへのイベント通知は妨げません。
このメソッドが呼ばれたハンドラより後に登録された他のコールバック関数も、全て呼び出されることになります。
これはtriggerで呼び出されるカスタムイベントであっても同様です。
既にstopPropagation()メソッドが呼ばれているかどうかを返します。

リスト15. jQuery.Event.isPropagationStopped()

jQuery('.Sample315 button').click(function(evt){
	if(evt.isPropagationStopped()) alert('1:止めました');
	evt.stopPropagation();
	if(evt.isPropagationStopped()) alert('2:止めました');
});
 
jQuery.Event.stopImmediatePropagation()
このメソッドが呼び出されて以降のハンドラを、全て実行しないようにします。
これは併せてstopPropagation()メソッドを呼び出すことで、バブリングも中断させます。
このメソッドが既に呼び出されているかどうかを知るには、isImmediatePropagationStoppedを用います。

リスト16. jQuery.Event.isPropagationStopped()

jQuery('.Sample316 *').click(function(evt){
  alert('第1回目の処理');
  evt.stopImmediatePropagation();
});
jQuery('.Sample316 *').click(function(evt){
  alert('第2回目の処理');
});
 
jQuery.Event.isImmediatePropagationStopped()
既にstopImmediatePropagation()メソッドが呼ばれているかを返します。

リスト17. jQuery.Event.isImmediatePropagationStopped()

jQuery('.Sample317 *').click(function(evt){
	if(evt.isImmediatePropagationStopped()) alert('1:完全中止');
	evt.stopImmediatePropagation();
	if(evt.isImmediatePropagationStopped()) alert('2:完全中止');
});
イベントハンドリング

jQueryは、addEventListenerメソッド同様に、イベントと動作を結びつけたり、解除することが可能です。

bind(イベントタイプ[,data],コールバック関数)
one(イベントタイプ[,data],コールバック関数)
指定した要素のイベントとそのイベントが呼び出されたときのコールバック関数を結びつけます。
イベントハンドラは、コールバック関数の第1引数に、jQuery.Eventオブジェクトを渡します。
コールバック関数からの戻り値がfalseの場合、イベントが持つ元々の動作をキャンセルします。
これにより、イベントのbubblingも止まりますので、親要素が持つイベントの発生もキャンセルされてしまうことに注意してください。
このメソッドの第2引数にデータを定義することができます。
その場合はコールバック関数が第3引数になります。
返り値:jQueryオブジェクト
oneメソッド
oneメソッドは、コールバック関数の実行が1回に限定されている以外、bindメソッドと同じです。

リスト18. bind(イベントタイプ[,data],コールバック関数)

// 「Sample418」クラス下の全要素にクリック時の処理を定義。
// その際、「since=2011」というデータも付加。
jQuery('.Sample418 *').bind('click',{ since:2011 },function(evt){
	alert('このイベントは'
		+ this.tagName + 'のイベント'
		+ '\nタイムスタンプ:' + evt.timeStamp
		+ '\nデータ「since」:' + evt.data.since
	);
});

実装例

 
unbind([イベントタイプ[,data]])
bind関数とは反対に、各要素のイベントに関連付けられた関数を削除します。
引数無しの場合は、全イベントを削除します。
第1引数にイベント名が指定された場合、そのイベントに関連付けられた関数だけが削除されます。
第2引数に関数ポインタを渡した場合、指定イベントに結び付けられた、指定の関数のみが削除されます。
bindしたカスタムイベントを削除することも可能です。
返り値:jQueryオブジェクト

リスト19. unbind([イベントタイプ[,data]])

var sw419 = true;
function Sample419(){ alert('マウスアウト'); }
jQuery('.Sample419 *').bind('click',function(evt){
	// クリックする度に動作設定を変更します。
	var str = jQuery(this).text();
	if( sw419 ){
		// マウスアウトを登録します。
		str = str.replace('登録','解除');
		jQuery(this).bind('mouseout', Sample419());
		sw419 = false;
	}
	else
	{
		// マウスアウトを削除します。
		str = str.replace('解除','登録');
		jQuery(this).unbind('mouseout');
		sw419 = true;
	}
	jQuery(this).text(str);
});
// マウスアウトを登録します。
jQuery('.Sample419 button').bind('mouseout', Sample419);

実装例

 
trigger(イベントタイプ, [data])
triggerHandler(イベントタイプ, [data])
各要素の指定されたイベントを実行します。
このメソッドを実行すると、指定されたイベントそのものの動作と、登録されたイベントハンドラの呼び出しを共に行います。
コールバック関数内の戻り値にfalseを返すなどの処理でキャンセルすることも可能です。
デフォルトで存在するイベントだけでなく、bindで登録したカスタムイベントなども呼び出すことが出来ます。
返り値:jQueryオブジェクト
triggerHandlerメソッド
triggerHandlerメソッドは、ブラウザのデフォルトの動作を行いません。

リスト20. trigger([イベントタイプ[,data]])

jQuery('.Sample420').bind('submit',function(evt,msg){
	// フォーム送信時の処理です。
	var str = '送信しません。';
	evt.preventDefault();
	if( msg ){
		str = str + '\n' + msg;
	}
	alert(str);
});
jQuery('.Sample420 input:last').click(function(evt){
	// resetボタンですが、ついでにフォーム送信時の処理もします。
	jQuery('.Sample420').trigger('submit',['※resetボタンにて']);
});

実装例

 
live(イベントタイプ, コールバック関数)
イベントに対してハンドラを登録します。
登録されたイベントは、現在および将来的にも、セレクタにマッチする全ての要素に適用されます。
カスタムイベントに対してbindすることも可能です。
liveで設定したイベントを削除するには、dieメソッドを用います。
返り値:jQueryオブジェクト

リスト21. live(イベントタイプ, コールバック関数)

jQuery('.Sample421 *').live('click',function(evt){
	jQuery(this).after('<button>実行ボタンのコピー</button>');
	evt.preventDefault();
});

実装例

 
die([イベントタイプ[,コールバック関数]])
liveメソッドと対になり、登録されたイベントを削除します。
引数がまったく省略された場合、全てのliveイベントを削除します。
liveメソッドで登録した、カスタムイベントも削除されます。
特定のliveイベントを削除するには、第2引数にコールバック関数(ポインタ)を指定します。
返り値:jQueryオブジェクト

リスト22. die([イベントタイプ[,コールバック関数]])

jQuery('.Sample422 *').live('click',function(evt){
	evt.preventDefault();
	jQuery(this).after('<button>実行ボタンのコピー</button>');
	jQuery('.Sample422 *').die('click');
});

実装例

イベントヘルパー

イベントの動作を定義する場合、常にbindで定義するのは結構面倒です。
jQueryでは、よく使われるイベントをイベントヘルパーといった形で、メソッド化しています。
これにより、簡単にイベントの動作を定義できます。

その中でも、jQuery独自のイベントヘルパーが存在します。
このヘルパーを使うと、インターラクティブなWEBアプリケーションを簡単に作ることができます。

hover(over, out)
マウスホバーの動きをシミュレートします。
引数は共に、コールバック関数です。
マウスカーソルが要素の上に乗った時: 第1引数 over が実行されます。
マウスが要素から外れた時: 第1引数 out が実行されます。
返り値:jQueryオブジェクト

リスト23. hover(over, out)

jQuery('.Sample523 *').hover(
	function(evt){
		//over
		jQuery(this).css('color','red').css('font-weight','bold');
	},
	function(evt){
		//out
		jQuery(this).css('color','').css('font-weight','');
	}
);

実装例

 
toggle(fn1, fn2, ..., fnN)
要素がクリックされる毎に、引数で渡したコールバック関数を実行します。
初回は最初のコールバック関数「fn1」が実行されます。
2回目以降は、その回数にあったコールバック関数が実行されます。
N回(最後)より多くクリックされると、一度初回に戻ります。
例えば、コールバック関数が2個の場合はトグルスイッチのようにON/OFF状態となります。
返り値:jQueryオブジェクト

リスト24. toggle(fn1, fn2, ..., fnN)

jQuery('.Sample524 *').toggle(
	function(evt){
		// 1回目
		var str = jQuery(this).text();
		jQuery(this).css('color','red');
		jQuery(this).text(str.replace('1回','2回'));
	},
	function(evt){
		// 2回目
		var str = jQuery(this).text();
		jQuery(this).css('font-weight','bold');
		jQuery(this).text(str.replace('2回','3回'));
	},
	function(evt){
		// 3回目
		var str = jQuery(this).text();
		jQuery(this).css('color','').css('font-weight','');
		jQuery(this).text(str.replace('3回','1回'));
	}
);

実装例

jQueryでは、その他一般的なイベントヘルパーも存在します。

focus([コールバック関数])
対象要素のfocusイベントを実行します。
コールバック関数が指定された場合、それを実行します。
blur([コールバック関数])
対象要素のblurイベントを実行します。
コールバック関数が指定された場合、それを実行します。
click([コールバック関数])
対象要素のclickイベントを実行します。
コールバック関数が指定された場合、それを実行します。
dblclick([コールバック関数])
対象要素のdblclickイベントを実行します。
コールバック関数が指定された場合、それを実行します。
change([コールバック関数])
対象要素のchangeイベントを実行します。
コールバック関数が指定された場合、それを実行します。
keydown([コールバック関数])
対象要素のkeydownイベントを実行します。
コールバック関数が指定された場合、それを実行します。
keypress([コールバック関数])
対象要素のkeypressイベントを実行します。
コールバック関数が指定された場合、それを実行します。
keyup([コールバック関数])
対象要素のkeypupイベントを実行します。
コールバック関数が指定された場合、それを実行します。
error([コールバック関数])
対象要素のerrorイベントを実行します。
コールバック関数が指定された場合、それを実行します。
select([コールバック関数])
対象要素のselectイベントを実行します。
コールバック関数が指定された場合、それを実行します。
submit([コールバック関数])
対象要素のsubmitイベントを実行します。
コールバック関数が指定された場合、それを実行します。
load(コールバック関数)
対象要素のloadイベントをコールバック関数で実行します。
unload(コールバック関数)
対象要素のunloadイベントをコールバック関数で実行します。
mousedown(コールバック関数)
対象要素のmousedownイベントをコールバック関数で実行します。
mouseup(コールバック関数)
対象要素のmouseupイベントをコールバック関数で実行します。
mouseover(コールバック関数)
対象要素のmouseoverイベントをコールバック関数で実行します。
mousemove(コールバック関数)
対象要素のmousemoveイベントをコールバック関数で実行します。
mouseout(コールバック関数)
対象要素のmouseoutイベントをコールバック関数で実行します。
resize(コールバック関数)
対象要素のresizeイベントをコールバック関数で実行します。
scroll(コールバック関数)
対象要素のscrollイベントをコールバック関数で実行します。