やりたいこと
ページの入力フォームから情報を入力して送信する際、入力によってはアラートを出して情報を送信させないようにする機能をAddEventListener
を使って実装したい。
今回は下記のような入力フォームがあって、2つのセレクトボックスからそれぞれ入力する情報を選択する。
もし各セレクトボックスから同じ選択肢を選んで「合体」ボタン(submitボタン)を押した場合、
アラートが出て入力情報が送信されるのを防ぎたい。(違う入力であれば出さない)
実装
formのidはselect_form
、各セレクトボックスのidはそれぞれfirst_persona
、second_persona
となっている。
addEventListener
で送信ボタンが押された時に入力情報を判定する関数が動作するようにしている。
<script>
function checkPersonaId(event){
const first_persona_id = document.getElementById('first_persona').value;
const second_persona_id = document.getElementById('second_persona').value;
if(first_persona_id == second_persona_id){
alert('同じペルソナは選べません');
event.stopPropagation();
event.preventDefault();
}
}
const form = document.getElementById('select_form');
form.addEventListener('submit', checkPersonaId);
</script>
ポイントはifブロック内のstopPropagation()
とpreventDefault()
。AddEventListener
でイベントをキャンセルしたいときには、これら2つのメソッドをどちらも記述する必要がある。
return falseではイベントをキャンセルできない
イベントハンドラのonSubmit
や、jQueryではreturn false
でイベントのキャンセルができるが、AddEventListener
を使っている場合にはreturn false
と記述してもイベントのキャンセルができない。
stopPropagationとpreventDefaultは何をしているのか
stopPropagation
は親要素へのイベント伝搬をキャンセルし、preventDefault
はその要素のイベント自体をキャンセルしている。
要素のイベントをキャンセルすれば良いと思ってpreventDefault
だけ記述すると、イベント伝搬だけが行われて意図しない挙動となるので注意。
jQueryでのreturn false
はこのあたりのキャンセルをきちんと行ってくれるらしい。