既存のフォームにバリデーション等何かしらの処理を挟みたい場合、jQuery を使えば簡単に実現できます。
実装方法
例として、まず下記のような単純なフォームがあるとします。
<form method="post" action="/hoge/confirm/">
<input type="text" name="name" /><br />
<input type="tel" name="name" /><br />
<input type="fax" name="name" /><br />
<input type="submit" value="送信" />
</form>
通常であれば、送信ボタンを押したら /hoge/confirm/ にすぐに遷移してしまいますが、ここで送信前に一旦処理を挟みたいと思います。
間に挟む処理の引数で処理完了時のコールバック関数を指定できる場合
間に挟む処理の引数で、処理完了時のコールバック関数を指定できる場合、そのコールバック関数内で送信処理を行います。submit イベントの最後に return false; を入れて自動で submit されないようにすることが重要です(これがないと処理完了時のコールバック関数が実行されない場合でも submit されてしまう)。
jQuery( funciton( $ ) {
// form が submit されたとき
var form = $( 'form' );
form.submit( function( e ) {
// 何か処理をする
// 完了時にコールバック関数を実行
hoge( 'fuga', function() {
// 同じ処理が二度走らないように、submitイベントを消してからsubmit
form.off( 'submit' );
form.submit();
} );
// 自動で submit されないように処理を止める
return false;
} );
} );
間に挟む処理の引数で処理完了時のコールバック関数を指定できない場合
間に挟む処理の引数で処理完了時のコールバック関数を指定できない場合は、処理の完了時間を見越して setTimeout で送信時間を遅らせます(API等で通信が発生する場合を想定。普通にバリデーション処理等であれば待ち時間は必要ないかもしれません)。
jQuery( funciton( $ ) {
// form が submit されたとき
var form = $( 'form' );
form.submit( function( e ) {
// 何か処理をする
hoge();
fuga();
// 一旦 submit を止める
p.preventDefault();
// submit を遅らせて実行
setTimeout( function() {
form.off( 'submit' );
form.submit();
}, 300 );
} );
} );
