15
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

jQueryでsubmit()するとHTML5のrequiredなどバリデーションが効かなくなる時の対処法

Last updated at Posted at 2020-02-05

導入

HTML5にはrequiredpatternなどの便利なバリデーション属性がありまして、submitするときにバリデーションしてくれるので便利です。

しかし、さまざまな事情により、javascriptやjQueryでsubmitさせる場合も多いかと思いますが、その場合、HTML5のバリデーションは無視されてしまいます。

とはいえ、実際にはHTML5のConstraint validation APIが動いており、バリデーションは機能していて、その結果を取得してあげれば、無視されずに済むようです。

コード

まず、無視されてしまう例です。

<form>
  <input type="text" name="test" required>
</form>
{
  // これだと値が空でもPOSTされてしまう。
  $('form').submit();
}

以下が、無視されない例です。
reportValidity()でバリデーションを通ったかどうかの結果を取得できます(通過していたらtrue)。checkValidity()というメソッドや、個別のフォーム要素ごとに結果を取得することもできますが、詳しくはドキュメントを参照ください。

$('form').reportValidity()ではなく$('form')[0].reportValidity()というとこにハマりました。特定のノードを指定しないといけないということでしょうね。素のJavaScriptはまだ弱いので想像ですが。

<form>
  <input type="text" name="test" required>
</form>
{
  if (! $('form')[0].reportValidity()) {
    return false;
  }

  $('form').submit();
}

参考

https://developer.mozilla.org/ja/docs/Web/Guide/HTML/HTML5/Constraint_validation
https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reportValidity

追記
個別のフォーム要素のバリデーション結果を取得する例です。いつか使うかもしれないので、記載しておきます。

$('form').find('input, select, textarea').each(function () {
  console.log($(this)[0].validity.valid);
});
15
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?