🐙

全モダンブラウザがrequestSubmit()サポート完了。submit送信するならこの書き方でOK。

2022/09/19に公開

Safari 16.0でrequestSubmit関数をサポート対応

Safari v16.0 が2022/9/12にリリースされました。
このリリースでサポートされた機能には<form>.requestSubmit() という関数が含まれています。
今までjs側処理でSubmitを実行する場合、submit関数を使用することが多かったです。では本件のrequestSubmit関数とはどんなメリットがあるのでしょうか?

これまでのsubmit()関数のデメリット

これまでもフォームエレメントを取得してjsにてsubmit()を行うことは可能でした。
しかしsubmit()を実行した場合のデメリットとして、フォーム内に書かれたバリデーション属性のチェックを無視して、単に送信のみが実行されてしまっていました。

submit関数の実行イメージ

<form name="form">
<input type="text" name="required" required>回答必須
</form>
const myForm = document.querySelector("form");
myForm.submit(); //←必須の入力フォームが空白でもチェックなしで送信される。。

バリデーション属性一覧
※参照: MDN > 制約検証

  • pattern
  • min
  • max
  • required
  • step
  • minlength
  • maxlength

今回requestSubmit()で改善へ

今回Safari 16でサポートされたrequestSubmit関数では、きちんとバリデーション属性の値をチェックして、エラーが発生した場合はsubmitを中止してくれます。
※参照: MDN > requestSubmit

バリデーションエラーがある場合のsubmit()とrequestSubmit()の挙動の違い(Gifアニメ)

▼ ポイント
submit関数:バリデーションエラーがあっても無視して送信実行
requestSubmit関数:バリデーションエラーがあったらsubmitせず中止し、適切にエラー処理してくれる

検証動画のhtml部分

<div class="wrap">
  <p class="description">submit()とrequestSubmit()について<br>バリデーション属性での比較</p>
  <form name="form">
    <input type="text" name="only-number" pattern="^[0-9]+$">pattern:数字のみ<br>
    <input type="number" name="min2" min="2">min:最小値2以上の数字<br>
    <input type="number" name="max2" max="2">max:最大値2以下の数字<br>
    <input type="text" name="required" required>required:必須(空不可)<br>
    <input type="text" name="minlength" minlength="5">minlength:空 or 5文字以上<br>
    <input type="text" name="maxlength" maxlength="5">maxlength:5文字以下<br>
    <input type="number" name="step" step="0.5">step:単位0.5ごと<br>
    <button type="submit" id="submitBtn">Submitボタン</button> 
    <button type="button" id="inputErrorBbtn" onclick="inputErrorBtn()">エラー発生文字挿入</button>
    <button type="reset">Reset</button> 
  </form>
  
  <button type="button" class="funcButton" name="requestsubmit_simple" onclick="simpleSubmit()">submit 関数実行</button><br>
  <button type="button" class="funcButton" name="requestsubmit_request" onclick="requestSubmit()">requestSubmit 関数実行</button>
</div>

検証動画のjs部分

const form = document.querySelector("form");
const submitButton = form.querySelector("#submitBtn");

function simpleSubmit(e){
  form.submit();
}
function requestSubmit(e){
  if (submitButton) {
    form.requestSubmit(submitButton);
  } else {
    form.requestSubmit();
  }
}
function inputErrorBtn(){
  document.querySelector('input[name="only-number"]').value = "あ";
  document.querySelector('input[name="min2"]').value = "1";
  document.querySelector('input[name="max2"]').value = "9";
}

モダンブラウザのサポート状況

今回のSafari対応でモダンブラウザ全てでサポートされました。
CanIuse > requestSubmit()

今後はjsでのsubmit送信は
submit()ではなく requestSubmit() を安心して使っていけそうですね。

Discussion