formタグ内でフォーム送信ボタンとは別にbuttonタグを配置したい場合に、クリックでフォームを送信しないようにする方法をメモ。
サンプルコード
まずは対応前のデモです。
formタグ内でプライバシーポリシーの内容をモーダルで表示する想定で実装してみます。
<form action="./complete.html" method="post">
<input type="text">
<hr>
<button data-modal_switch="policy">プライバシーポリシーを確認</button>
<div data-modal_content="policy" class="modal">
<div class="modal_content">プライバシーポリシーのサンプル</div>
</div>
<hr>
<button>送信</button>
</form>
JavaScriptでモーダルの処理を追加します。
const modalSwitch = document.querySelectorAll('[data-modal_switch]');
for (let i = 0; i < modalSwitch.length; i++) {
modalSwitch[i].addEventListener('click', function(e) {
const target = this.getAttribute('data-modal_switch');
document.querySelector('[data-modal_content = "' + target + '"]').classList.add('is-open');
});
}
この場合、プライバシーの確認ボタンをクリックするとフォームの送信が行われてしまいます。
対応前のデモページ
対応方法は2種類あります。
まず1つ目は、モーダルボタンクリック時にフォームの送信を止める処理を追加する方法です。
const modalSwitch = document.querySelectorAll('[data-modal_switch]');
for (let i = 0; i < modalSwitch.length; i++) {
modalSwitch[i].addEventListener('click', function(e) {
e.preventDefault();
const target = this.getAttribute('data-modal_switch');
document.querySelector('[data-modal_content = "' + target + '"]').classList.add('is-open');
});
}
これでフォームの送信がされないようになりました。
JavaScriptでの対応のデモページ
もう1つは、buttonタグのtype属性にbuttonを設定する方法です。
<form action="./complete.html" method="post">
<input type="text">
<hr>
<button data-modal_switch="policy" type="button">プライバシーポリシーを確認</button>
<div data-modal_content="policy" class="modal">
<div class="modal_content">プライバシーポリシーのサンプル</div>
</div>
<hr>
<button>送信</button>
</form>
buttonタグのtype属性は初期値がsubmitになっているため、未設定の場合はフォームの送信となってしまうようです。
type属性での対応のデモページ
コメントが承認されるまで時間がかかります。