~stopImmediatePropagation、stopPropagation、preventDefaultの違い
- event.stopImmediatePropagation();
- event.stopImmediatePropagation; を実行後、同一要素(event.targetが同じ)で未だ実行されいない イベント(addEventListenerでclickイベントを複数登録している場合等)と、 親要素(その親要素も・・・)へのイベント伝番もキャンセルされる
- event.stopPropagation();
- 親要素(その親要素も・・・)へのイベント伝番だけがキャンセルされる
- event.preventDefault();
-
例えば
<a href="#scroll" onclick="event.stopPropagation();">クリック</a>
をクリックした場合、ID="scroll"の要素にスクロールする処理のような、ブラウザが元々持っている処理をキャンセルします。
サンプル
<script> window.addEventListener("load",function(){ document.getElementById("ATag").addEventListener("click",function(event){ //要素(id="ATag")に1つ目のclickイベントを追加 //これ以降の同一要素のイベント「alert("クリック2");」と、 //親要素へのイベント伝播「alert("クリック3");」 //がキャンセルされる event.stopImmediatePropagation(); //親要素へのイベント伝播「alert("クリック3");」 //だけがキャンセルされる event.stopPropagation(); //<a href="#scroll">のようなブラウザが元々持っている処理をキャンセルする //この例では id="scroll" の要素にスクロールしない event.preventDefault(); alert("クリック1"); }); document.getElementById("ATag").addEventListener("click",function(event){ //要素(id="ATag")に2つ目のclickイベントを追加 //stopImmediatePropagationでイベントがキャンセルされる alert("クリック2"); }); document.getElementById("ParentDivTag").addEventListener("click",function(event){ //stopImmediatePropagation又はstopPropagationでこの要素(親要素)へのイベント伝播がキャンセルされる alert("クリック3"); }); }); </script> <div id="ParentDivTag"> <a href="#scroll" id="ATag">押すと下へスクロール</a><br> </div> <div style="padding-top:1200px;"> <div id="scroll"> aタグのhref="#scroll"で本来はココにスクロールする (preventDefaultでキャンセルされスクロールしない) </div> </div>