jQueryのtriggerは子要素から親要素に向けてバブリング(伝搬)する。
以下のようなdiv階層で試してみる。
HTMLでは以下の通り。
<div id="parent" style="background-color: #ff0000; width: 200px; height: 100px;">
<span>parent</span>
<div id="child" style="background-color: #ffff00; width: 150px; height: 70px;">
<span>child</span>
<div id="grandson" style="background-color: #00ffff; width: 100px; height: 40px;">
<span>grandson</span>
</div>
</div>
</div>
独自イベント”hello”のイベントハンドラを各要素で定義する。
$(window).on(
"hello",
function(e, msg) {
console.log("> " + "window: " + e.type + " " + msg);
}
);
$(document).on(
"hello",
function(e, msg) {
console.log("> " + "document: " + e.type + " " + msg);
}
);
$("#parent").on(
"hello",
function(e, msg) {
console.log("> " + this.id + ": " + e.type + " " + msg);
}
);
$("#child").on(
"hello",
function(e, msg) {
console.log("> " + this.id + ": " + e.type + " " + msg);
}
);
$("#grandson").on(
"hello",
function(e, msg) {
console.log("> " + this.id + ": " + e.type + " " + msg);
}
);
この状態で各要素からイベントをtriggerしてみる。
console.log("(1)");
$("#parent").trigger("hello", ["from parent"]);
console.log("(2)");
$("#child").trigger("hello", ["from child"]);
console.log("(3)");
$("#grandson").trigger("hello", ["from grandson"]);
console.log("(4)");
$(document).trigger("hello", ["from document"]);
console.log("(5)");
$(window).trigger("hello", ["from window"]);
結果は以下の通り。
(1) > parent: hello from parent > document: hello from parent > window: hello from parent (2) > child: hello from child > parent: hello from child > document: hello from child > window: hello from child (3) > grandson: hello from grandson > child: hello from grandson > parent: hello from grandson > document: hello from grandson > window: hello from grandson (4) > document: hello from document > window: hello from document (5) > window: hello from window
一番枝葉のgrandson要素からは全てに伝搬するが、parent要素からは上位のdocumentとwindowへ伝搬するだけだ。
AngularJSの$broadcastのように子方向へ伝搬する(キャプチャーと言うそうです)triggerはない。
全ソースを以下に示します。
<!DOCTYPE html>
<html>
<head>
<meta charset="Shift_JIS">
<title>Bubbling test</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript">
$(
function() {
setTimeout(
function() {
console.log("(1)");
$("#parent").trigger("hello", ["from parent"]);
console.log("(2)");
$("#child").trigger("hello", ["from child"]);
console.log("(3)");
$("#grandson").trigger("hello", ["from grandson"]);
console.log("(4)");
$(document).trigger("hello", ["from document"]);
console.log("(5)");
$(window).trigger("hello", ["from window"]);
},
1000
);
$(window).on(
"hello",
function(e, msg) {
console.log("> " + "window: " + e.type + " " + msg);
}
);
$(document).on(
"hello",
function(e, msg) {
console.log("> " + "document: " + e.type + " " + msg);
}
);
$("#parent").on(
"hello",
function(e, msg) {
console.log("> " + this.id + ": " + e.type + " " + msg);
}
);
$("#child").on(
"hello",
function(e, msg) {
console.log("> " + this.id + ": " + e.type + " " + msg);
}
);
$("#grandson").on(
"hello",
function(e, msg) {
console.log("> " + this.id + ": " + e.type + " " + msg);
}
);
}
);
</script>
</head>
<body>
<div id="parent" style="background-color: #ff0000; width: 200px; height: 100px;">
<span>parent</span>
<div id="child" style="background-color: #ffff00; width: 150px; height: 70px;">
<span>child</span>
<div id="grandson" style="background-color: #00ffff; width: 100px; height: 40px;">
<span>grandson</span>
</div>
</div>
</div>
</body>
</html>
