0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Fetch通信でフォームが意図せずリロードされる問題の解決方法

Posted at

発生した事象

HTMLフォームを使った画面で、ボタンクリック時にJavaScriptの fetch によりサーバへ非同期通信を行う実装を行った。

フォーム入力後ボタンをクリックすると、サーバ処理は正常に完了するものの、画面がリロードされfetch の処理が途中で中断し、画面遷移に失敗した。

一方で、なぜかフォーム未入力時はリロードがされずにfetch が正常動作し、画面遷移に成功していた。

問題の原因

ボタンが<button type="submit">であるため、デフォルトのフォーム送信(submit イベント)が発生し、ページリロードが行われた。

入力がある場合、HTMLフォームは正常な送信条件を満たすため、fetch中でもリロードが優先されfetch処理が中断された。

一方で、ボタンにrequiredを付与していたため、未入力時はバリデーションエラーにより、デフォルトのフォーム送信がブロックされ、リロードが防がれたため fetch が完了していた。

ブラウザ側では処理が途中で途切れるが、すでにサーバにはリクエストが届いているため、サーバ側では処理が正常に完了している。

解決方法

方法1: event.preventDefault() でデフォルト送信を無効化

方法2: type="submit" を type="button" に変更することで、デフォルトのフォーム送信を防ぐ。

技術的な学び

フォームのデフォルト動作に注意

<button type="submit">は意図せずページ遷移やリロードを引き起こす可能性がある。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?