PCがあれば何でもできる!

へっぽこアラサープログラマーが、覚えたての知識を得意げにお届けします

【jQuery】Formの2重投稿を防ぐ方法(submitボタンが2つ以上ある場合)

Formの2重投稿はサーバ側でも防止するべきですが、UIを考えるとフロント側でも防止出来たほうが嬉しいですよね。

まず、submitボタンが1つの場合によくあるのは、submitボタンにdisableをかける方法。

例えばこんな感じ。

<!-- フォーム -->
<form id="sample_form">
  <button type="submit">submit</button>
</form>

<!-- スクリプト(jQuery読込前提) -->
<script>
$(function(){
  $('#sample_form').on('submit', function(){
    // submitボタンにdisabledをかける
    $(this).find('button[type="submit"]')
      .attr('disabled', 'disabled')
      .text('登録中…');
  });
});
</script>

cssメソッドでopacityをかけたり、pointer-eventsを切ったりすると、見た目も無効っぽくなります。

ただ、この方法だと2つ以上submitボタンが有る場合に問題が出てきます。

一般的にはsubmitボタンに別々のvalue属性を付けることで、submit時に押したボタンのvalueが送信されるため、どちらのボタンを押したかをサーバ側で判別できます。
しかし、submitボタンにdisabledをかけてしまうと、submit時に押したボタンのvalueが送信されません^^;

そこで、disabledをかけるのをやめ、submitイベント側で2回目以降はsubmitを中断させることで対応。

<!-- フォーム -->
<form id="sample_form">
  <button type="submit" name="submit" value="1">submit1</button>
  <button type="submit" name="submit" value="2">submit2</button>
</form>

<!-- スクリプト(jQuery読込前提) -->
<script>
$(function(){
  $('#sample_form').on('submit', function(){
    // 一度submitされていればsubmitをキャンセル
    if ($(this).data('submitted')) { return false; }

    // submitボタンのテキスト変更
    $(this).find('button[type="submit"]')
      .text('登録中…');

    // submit済のフラグを立てる
    $(this).data('submitted', true);
  });
});
</script>

他にいい方法あれば教えて下さい!