初心者向けのjQuery入門講座|デザイナー向けのJavaScriptライブラリ

このエントリーをはてなブックマークに追加
索引
Core:コアとなる仕組み
Selectors:セレクタ
Attributes:属性
Traversing:対象の変更
Manipulation:操作
CSS:スタイルシート
Events:イベント
Effects:演出効果
Ajax:xml等との連携
Utilities:ユーティリティ
Data:データ
Miscellaneous:諸々
Deferred:処理管理
Callbacks:コールバック
Internals:内部処理

.delegate( )イベント発生時に実行する処理を設定します

構文

イベント発生時に実行する処理を設定します返値:jQueryオブジェクト
調査範囲.delegate( セレクタ, イベント名, function)ver1.4.2〜
調査範囲.delegate( セレクタ, イベント名, object, function)ver1.4.2〜
調査範囲.delegate( セレクタ, object )ver1.4.3〜
調査範囲はjQueryオブジェクトにしないといけません。

機能

liveメソッドbindメソッドと比較して、動的に追加された要素にもイベントを設定でき非常に便利です。しかしイベントが発生するたびにDOMの状態を確認するため、負荷の高い処理になってしまいました。そこで登場したのがdelegateメソッドです。delegateメソッドでは調査範囲を限定することで負荷を下げています
liveメソッドは負荷が高いためv1.9で廃止されました。

delegateメソッドは調査範囲(jQueryオブジェクトで指定)内にあるセレクタで指定した要素にイベントが発生した時に実行するfunctionを設定します。設定できるイベントは左メニューのマウスイベント(click)〜ロードイベント(ready)※ただしhover,toggleは除くです。

ver1.4.3からはobjectオブジェクトを利用して、一度に複数のイベントを設定できます。

現在では利用せずにonメソッドを利用するようにしてください。

解説

イベント発生時に実行する処理を設定

サンプル(delegate/01.html)を開いてbody内にboxのclass属性が設定されたdiv要素が2つあることを確認してください。これらのdiv要素は、それぞれmainとsubの異なるid属性が設定されたdiv要素内にあります。

<div id="main">
	<div class="box"></div>
</div>
<div id="sub">
	<div class="box"></div>
</div>

jQueryは以下の様に記述され、delegateメソッドの引数にはセレクタとしてboxのclass属性の要素、イベント名として「click」、そしてfunctionに「clickFunc」が設定されています。特徴的なのは、最初のjQueryオブジェクトが調査範囲となっていることです(サンプルではid属性mainが設定されています)。これでid属性mainに含まれる要素しか調べなくなり、その分、高速に処理できるというわけです

$(function () {
	$("#main").delegate(".box", "click", clickFunc);
});

delegateメソッドの引数に設定するfunctionは以下の様な構文になっています。まず引数(イベントオブジェクト)を受け取ります。そしてイベント名で指定したイベントが発生したら実行したい処理を{}の中に書きます、何かをreturnする必要はありません。イベントオブジェクトは別項にまとめてあります。

delegateメソッドに設定するfunctionの構文
function 任意の名前(イベントオブジェクト){
 イベント名で指定したイベントが発生したら実行したい処理
}

サンプルdelegate/01.htmlで利用したclickFuncは以下の様になっており、アラートで「click」と表示します。

function clickFunc(eo){
	alert("click");
};

結果として、上のdiv要素をクリックするとアラートで「click」と表示されます。下のdiv要素はid属性mainの要素には含まれないため、調査はされずイベントに反応しません
functionの設定は無名関数を利用することが多いです。→サンプル(delegate/01b.html

$("#main").delegate(".box", "click", function (eo){
	alert("click");
});

複数のイベントに共通のfunctionを設定

delegateメソッドのイベント名は半角スペースを挟むことで複数のイベントに共通のfunctionを設定できます。
サンプル(delegate/02.html)を開いてbody内の構成はdelegate/01.htmlと同じ事を確認してください。jQueryもほとんどdelegate/01.htmlと同じで、異なるのは以下の様にイベント名に半角スペースを挟んで「mouseenter」が追加されていることです。

$(function () {
	$("#main").delegate(".box", "click mouseenter", clickFunc);
});

結果として、上のdiv要素にマウスカーソルが入った時(mouseenter)もアラートで「click」と表示されます。この構文では各イベントとも共通のfunctionしか設定できません。複数のイベントに異なるfunctionを設定したい場合は2項先の「まとめて複数のイベントを設定する」の構文を利用します。

objectオブジェクトをfunctionに渡す

イベント名とfunctionの間(つまり第3引数)にobjectオブジェクトを設定することで、実行するfunctionにデータを渡すことができます。データはイベントオブジェクトのdataプロパティを介して渡されます。サンプル(delegate/03.html)を開いてbody内の構成はdelegate/01b.htmlと同じ事を確認してください。

jQueryは以下の様に記述され、delegateメソッドの第3引数にtestプロパティが10の値を持ったobjectオブジェクトが設定されています。このデータはイベントオブジェクト(eo)を通してfunctionに渡され、dataプロパティの値として取得できます。このサンプルでは、この値をアラートで表示します。

$("#main").delegate(".box", "click", {test:10}, function (eo){
	alert(eo.data.test);
});

結果として、上のdiv要素をクリックすると第3引数で渡されたtestプロパティの値「10」がアラートで表示されます。

まとめて複数のイベントを設定する

v1.4.3からdelegateメソッドは、第2引数にobjectオブジェクトを設定することで複数のイベントにそれぞれ個別のfunctionを設定できます。サンプル(delegate/04.html)を開いてbody内の構成はdelegate/01.htmlと同じ事を確認してください。

jQueryは以下のように「eventObj」というobjectオブジェクトを作成し、そのプロパティとしてイベント名を設定します。サンプルではmouseenterとmouseleaveのイベントを設定し、実行したいfunctionを代入しています。mouseenterで背景色をオレンジに、mouseleaveで背景色を青にしています。

eventObj = new Object();
eventObj.mouseenter = function(eo){
	$(this).css("background-color","#f93");
};
eventObj.mouseleave = function(eo){
	$(this).css("background-color","#09c");
};

作成したobjectオブジェクトは以下の様にdelegateの第2引数として設定します。結果として、上のdiv要素にマウスカーソルを重ねるとdiv要素の背景色がオレンジ色になり、マウスカーソルを外すと青に戻ります。

$(function () {
	$("#main").delegate(".box", eventObj);
});

構造が分かりにくくなりますが、objectオブジェクトをdelegateメソッドの第2引数に直接設定することも可能です。→サンプル(delegate/04b.html

falseを返すfunctionの利用

functionを設定する部分にfalseを設定すると、イベントフローを停止しブラウザ本来の機能も停止することができます。この機能があるためイベント発生時の処理(function)内で「return false」を実行すると、イベントフローを停止しブラウザ本来の機能も停止するのです

サンプル(delegate/05.html)を開いてbody内にa要素が1つあるのを確認してください。jQueryは以下の様に記述され、a要素がクリックされたらtextメソッドを利用してa要素の文字部分を「クリックされたよ」と変更します。

$("body").delegate("a", "click", function(){
	$(this).text("クリックされたよ");
	return false;
});

ポイントは3行目の「return false;」です。この処理があるので、a要素をクリックしてもブラウザ本来のリンク処理は実行されません。また、このサンプルでは確認できませんがイベントフローも停止します。これについては使い方を確認してください。→参考:使い方「イベントフロー(1)」

関連項目

設定したイベント発生時の処理を解除したい場合はundelegateメソッドを利用します。

メモ

onメソッドを利用しましょう

イベントハンドラアタッチメントはbindメソッドから始まってliveメソッド、delegateメソッドと進化してきました。その結果、多くの構文が混在し混乱を招く結果になったためv1.7でonにまとめられました。

delegateメソッドは非推奨にはなっていませんが、delegateメソッドとonメソッドは引数の順番が異なり混乱を招きます。ですのでdelegateメソッドは覚えずにonメソッドを覚えるようにしましょう