jQueryã§ã€ãã³ããããªã³ã°ãé²ã4ã€ã®æ¹æ³
WebéçºãããŠãããšãããèŠçŽ ãã¯ãªãã¯ããã®ã«ãæå³ãã芪èŠçŽ ã®ã€ãã³ããŸã§äžç·ã«çºç«ããŠããŸã£ãçµéšããããšæããŸããããã¯ãã€ãã³ããããªã³ã°(Event Bubbling)ããšããçŸè±¡ã«ãããã®ã§ããã€ãã³ããããªã³ã°ã¯æ£ããçè§£ãæŽ»çšã§ããã°äŸ¿å©ãªäžæ¹ã§ãã»ãšãã©ã®å ŽåãäºæããªãæåãåŒãèµ·ãããã³ãŒããè€éã«ããŠããŸããŸãã
ãã®ãã¹ãã§ã¯ãjQueryã«ãããã€ãã³ããããªã³ã°ãšã¯äœãã説æããããã广çã«å¶åŸ¡ãã 4ã€ã®æ¹æ³ ãã³ãŒãäŸä»ãã§è©³ãã解説ããŸãããã®èšäºãéããŠã€ãã³ãåŠçãžã®çè§£ãæ·±ãããããã£ãããšäºæž¬å¯èœãªã³ãŒããæžãæå©ãã«ãªãã°å¬ããã§ãã
ã€ãã³ããããªã³ã°ãšã¯ïŒ
ã€ãã³ããããªã³ã°ãšã¯ããã DOM èŠçŽ ã§ã€ãã³ããçºçãããšãããã®ã€ãã³ãã芪èŠçŽ ãžã𿬡ã ã«äŒæããŠããçŸè±¡ã®ããšãæããŸãããŸãã§æ°Žäžã®æ°æ³¡ã衚é¢ã«åãã£ãŠäžæããããã«é²ããããããããªã³ã°ïŒbubblingïŒããšåŒã°ããŸãã
ããšãã°ã<div> ã®äžã«ãã <button> ãã¯ãªãã¯ãããšããŸã <button> ã®ã¯ãªãã¯ã€ãã³ããçºç«ãããã®åŸã芪㮠<div> ã®ã¯ãªãã¯ã€ãã³ããããã« <body> â <html> â document ãšãé ã«ã€ãã³ããäŒæããŠãããŸãã
ããããæåã¯ãã€ãã³ãå§è²ïŒevent delegationïŒãªã©æçšãªãã¿ãŒã³ãå®çŸãããšãã«ã¯åœ¹ã«ç«ã¡ãŸãããåèŠçŽ ã«ç°ãªãã€ãã³ããã³ãã©ãçµã³ã€ããããŠããå Žåãæå³ããªãåäœãåŒãèµ·ããå¯èœæ§ããããŸããããšãã°ããããã¢ããã®å éšãã¯ãªãã¯ãããšãã«ã芪èŠçŽ ã®ããããã¢ãããéãããã€ãã³ããŸã§çºç«ããŠããŸãããããã¢ãããéããŠããŸããããªã±ãŒã¹ã§ããã ãããããã€ãã³ãã®äŒæãå¶åŸ¡ããæ¹æ³ãç¥ã£ãŠããããšã¯éåžžã«éèŠã§ãã
å¶åŸ¡ãããªããããªã³ã°ã®åé¡ç¹
ã€ãã³ããããªã³ã°ãé©åã«æ±ããªããšãã€ãã³ãã芪èŠçŽ ãŸã§äŒæããŠããŸããæå³ããªãåäœãçºçããããšããããŸãã以äžã«å®éã®ã±ãŒã¹ãããã€ãèŠãŠã¿ãŸãããã
ãã£ãšãããããäŸã¯ã¢ãŒãã«ïŒãããã¢ãããŠã£ã³ããŠïŒã§ããéåžžããããã¢ããã®å€åŽã«ããæãèæ¯ïŒãªãŒããŒã¬ã€ïŒãã¯ãªãã¯ãããšããããã¢ãããéããããã«å®è£
ããŸãããã®ãšããèæ¯çš <div> ã«ã¯ãªãã¯ã€ãã³ããèšå®ããããã§ãããããããããã¢ããå
éšã®ã³ã³ãã³ãïŒãã¿ã³ãå
¥åæ¬ãªã©ïŒãã¯ãªãã¯ãããšãã«ãã€ãã³ãããããªã³ã°ãããŠèæ¯ <div> ã®ã¯ãªãã¯ã€ãã³ããçºç«ããŠããŸããšããŠãŒã¶ãŒã¯ã³ã³ãã³ããæäœããããšãããã³ã«ãããã¢ãããéããŠããŸããšããäžå¿«ãªäœéšã匷ããããŸãã
å¥ã®äŸãšããŠãã¯ãªãã¯å¯èœãªã«ãŒãäžèЧããããããããã®ã«ãŒããã¯ãªãã¯ãããšè©³çްããŒãžã«é·ç§»ãã仿§ãèããŠã¿ãŠãã ãããã«ãŒãã®äžã«ãåé€ããã¿ã³ããããšããŸãããåé€ããã¿ã³ãã¯ãªãã¯ãããšå逿äœãå®è¡ããããšããããªã³ã°ãé²ããªããšèŠªã®ã«ãŒãã¯ãªãã¯ã€ãã³ããçºç«ããŠããŸããæå³ãã詳现ããŒãžã«é·ç§»ããŠããŸãããšããããŸããããããåé¡ã¯ãŠãŒã¶ãŒäœéšãèããæãããããå¿ ã察åŠãã¹ãã§ãã
æ¹æ³ 1: event.stopPropagation()
ã€ãã³ããããªã³ã°ãé²ããã£ãšãçŽæ¥çã§äžè¬çãªæ¹æ³ã¯ãevent.stopPropagation() ã¡ãœããã䜿ãããšã§ãããã®ã¡ãœããã¯ãçŸåšã®èŠçŽ ããäžäœèŠçŽ ãžã®ã€ãã³ãäŒæã忢ããŸãã
ã€ãã³ããã³ãã©é¢æ°ã«æž¡ããã event ãªããžã§ã¯ãã§ stopPropagation() ãåŒã³åºããšããã®èŠçŽ ã®ã€ãã³ããã³ãã©èªäœã¯å®è¡ãããŸããããã®ã€ãã³ãã芪èŠçŽ ãžäŒæããã®ã¯æ¢ãŸããŸãã
以äžã®ã³ãŒãã¯ã<span> èŠçŽ ãã¯ãªãã¯ãããšãã«ããã®èŠªã® <div> ã®ã¯ãªãã¯ã€ãã³ããçºç«ããªãããã«ããäŸã§ãã
// HTML æ§é
// <div id="parent">
// <span id="child">åèŠçŽ ãã¯ãªãã¯ïŒ</span>
// </div>
// 芪 div ã«ã¯ãªãã¯ã€ãã³ããèšå®
$('div').click(function(){
alert('div ãã¯ãªãã¯ãããŸããã');
});
// å span ã«ã¯ãªãã¯ã€ãã³ããèšå®
$('span').click(function(e){
// ã€ãã³ãäŒæãæ¢ããŸã
e.stopPropagation();
alert('span ãã¯ãªãã¯ãããŸããã');
});
ãã®äŸã§ã¯ã<span> ãã¯ãªãã¯ãããšãspan ãã¯ãªãã¯ãããŸãããããšããã¢ã©ãŒãã ãã衚瀺ãããe.stopPropagation() ã«ãã£ãŠã€ãã³ãäŒæãæ¢ããããã®ã§ãdiv ãã¯ãªãã¯ãããŸãããããšããã¢ã©ãŒãã¯è¡šç€ºãããŸããããã e.stopPropagation() ãã³ã¡ã³ãã¢ãŠãããŠå®è¡ãããšãspan ã®ã¢ã©ãŒãã®ããšã« div ã®ã¢ã©ãŒããç¶ããŠåºãããšã確èªã§ããŸãã
æ¹æ³ 2: event.stopImmediatePropagation()
event.stopImmediatePropagation() ã¯ãstopPropagation() ãããããã«åŒ·åãªã¡ãœããã§ããstopPropagation() ã芪èŠçŽ ãžã®äŒæãæ¢ããã®ã«å¯ŸããstopImmediatePropagation() 㯠åãèŠçŽ ã«ãã€ã³ããããã»ãã®ã€ãã³ããã³ãã©ã®å®è¡ãããæå¶ããŸãã
ã€ãŸããäžã€ã®èŠçŽ ã«è€æ°ã®ã¯ãªãã¯ã€ãã³ããã³ãã©ãçµã³ã€ããŠããå Žåã«äœ¿ããšå¹æçã§ãã
$('#myButton').on('click', function(e) {
alert('æåã®ãã³ãã©ãå®è¡ãããŸããïŒ');
// åãèŠçŽ ã®ä»ã®ãã³ãã©å®è¡ããã³ãããªã³ã°ããã¹ãŠäžæ¢
e.stopImmediatePropagation();
});
$('#myButton').on('click', function(e) {
// ãã®ãã³ãã©ã¯æ±ºããŠå®è¡ãããŸãã
alert('2çªç®ã®ãã³ãã©ãå®è¡ãããŸããïŒ');
});
$('#parentDiv').on('click', function(e) {
// ãã¡ãããããªã³ã°ã忢ããå®è¡ãããŸãã
alert('芪 Div ã®ãã³ãã©ãå®è¡ãããŸããïŒ');
});
ãã®ã³ãŒãã§ã¯ããã¿ã³ãã¯ãªãã¯ãããšãæåã®ãã³ãã©ãå®è¡ãããŸããïŒããšããã¢ã©ãŒãã ã衚瀺ãããŸããstopImmediatePropagation() ãåŒã°ããŠãããããåãèŠçŽ ã«çµã³ã€ãã 2çªç®ã®ãã³ãã©ãã芪㮠div ã®ãã³ãã©ãããããå®è¡ãããŸãããé垞㯠stopPropagation() ã§ååã§ãããè€éãªã€ãã³ããã€ã³ãã£ã³ã°æ§é ã§ãã®ãããªã±ãŒã¹ããããšãã«ã¯ stopImmediatePropagation() ã圹ç«ã¡ãŸãã
æ¹æ³ 3: æ¡ä»¶ä»ããã§ã㯠(event.target)
å Žåã«ãã£ãŠã¯ãã€ãã³ãäŒæãç¡æ¡ä»¶ã§æ¢ããã®ã§ã¯ãªããã©ã®èŠçŽ ã§ã€ãã³ããçºçãããããã§ãã¯ããŠæ¡ä»¶ä»ãã§åŠçãå¶åŸ¡ããæ¹ãè¯ãå ŽåããããŸããevent.target ããããã£ã䜿ãã°ãã€ãã³ããæåã«çºçããèŠçŽ ã調ã¹ãããšãã§ããŸãã
芪èŠçŽ ã®ã€ãã³ããã³ãã©ã®äžã§ event.target ããã§ãã¯ããç¹å®ã®åèŠçŽ ã§çºçããã€ãã³ãã§ããã°èŠªèŠçŽ ã®åŠçãã¹ãããããããã«èšèšã§ããŸãã
// HTML æ§é
// <div id="myDiv">
// ãããã¯ãªãã¯ããŠãã ããã
// <a href="#" id="myLink">ãã®ãªã³ã¯ã¯ã¯ãªãã¯ããªãã§ãã ããã</a>
// </div>
$("#myDiv").click(function(event) {
// ã€ãã³ãã®çºçå
ã <a> ã¿ã°ã§ãªãå Žåã«ã®ã¿åŠçãå®è¡
if (!$(event.target).is("a")) {
alert('Div ãã¯ãªãã¯ãããŸããïŒãªã³ã¯é€ãïŒã');
// æ¢åã®ãã³ãã©ããžãã¯
}
});
$("#myLink").click(function() {
alert("ãªã³ã¯ãã¯ãªãã¯ãããŸããïŒ");
});
ãã®æ¹æ³ã䜿ããšã<a> ã¿ã°ãã¯ãªãã¯ããå Žåã¯ããªã³ã¯ãã¯ãªãã¯ãããŸããïŒããšããã¢ã©ãŒãã ã衚瀺ããã<div> ã®ä»ã®éšåãã¯ãªãã¯ãããšãã ããDiv ãã¯ãªãã¯ãããŸããïŒãªã³ã¯é€ãïŒãããšããã¢ã©ãŒãã衚瀺ãããŸããstopPropagation() ã䜿ãããšãã芪èŠçŽ ã§åèŠçŽ ç±æ¥ã®ã€ãã³ããåºå¥ããŠåŠçã§ãããããã³ãŒããæè»ã«ãªããŸãã
æ¹æ³ 4: .off() ã«ããã€ãã³ãè§£é€
off() ã¡ãœããã¯ãèŠçŽ ã«ãã€ã³ããããã€ãã³ããã³ãã©ãè§£é€ããããã®ãã®ã§ãããšãã«ã¯ãã€ãã³ããéè€ããŠãã€ã³ããããè€æ°åå®è¡ãããŠããããã«èŠããããšããããŸãããããã¯ãããªã³ã°ãšãããããåãã€ãã³ããè€æ°åç»é²ãããŠããããšãåå ã§ããããšãå€ãã§ãã
ãã®ãããªå Žåã«ã¯ãæ°ããªã€ãã³ãããã€ã³ãããåã« .off() ã䜿ã£ãŠæ¢åã®ã¯ãªãã¯ã€ãã³ãããã¹ãŠè§£é€ãããã®åŸ .on() ã§æ°ããã€ãã³ãããã€ã³ããããšããæ¹æ³ã§åé¡ã解決ã§ããŸãã
// ã€ãã³ãããã€ã³ãããåã«ãæ¢åã® 'click' ã€ãã³ãããã¹ãŠè§£é€
$(element).off('click').on('click', function () {
// ããã«å®è¡ãããåŠçãèšè¿°
});
ãã®æ¹æ³ã¯ãåçã«ã³ã³ãã³ããå€ããããŒãžã§ã€ãã³ããã³ãã©ãæå³ããéè€ããŠç©ã¿éãªãã®ãé²ãã®ã«æå¹ã§ãããã ããããã¯ãããªã³ã°ãæ ¹æ¬çã«é²ãæ¹æ³ãšãããããã€ãã³ãéè€å®è¡ã®ãã°ãé²ã察çãšããŠäœ¿ãã¢ãããŒãã§ããç¹ãçæããŠãã ããã
ããè¯ãã€ãã³ã管çã®ããã«
ãããŸã§ãjQuery ã«ãããã€ãã³ããããªã³ã°ãé²ã 4 ã€ã®æ¹æ³ãèŠãŠããŸãããåæ¹æ³ã«ã¯ç¬èªã®äœ¿çšã±ãŒã¹ãšå©ç¹ããããŸãã
-
event.stopPropagation()ïŒãã£ãšãäžè¬çãªãããªã³ã°é²æ¢ææ®µ -
event.stopImmediatePropagation()ïŒåãèŠçŽ ã®ä»ã®ãã³ãã©ã忢ãããããšãã«äœ¿ã -
æ¡ä»¶ä»ããã§ãã¯ïŒã€ãã³ãçºçå ãæ€æ»ããŠæè»ã«ããžãã¯ãå¶åŸ¡ããããšãã«äŸ¿å©
-
.off()ïŒã€ãã³ãã®éè€ãã€ã³ãã£ã³ã°åé¡ãé²ãã®ã«å¹æç
ç¶æ³ã«å¿ããŠé©åãªæ¹æ³ãéžã³ãã€ãã³ãã®æµããæç¢ºã«å¶åŸ¡ããããšã倧åã§ããæ£ããã€ãã³ã管çã¯ãäºæž¬å¯èœã§ã¡ã³ããã³ã¹ããããã³ãŒããæžãããã®ç¬¬äžæ©ã§ãããã®æç« ããããªãã® jQuery éçºã®å©ãã«ãªãã°å¹žãã§ãïŒ