いろいろ調べてみて、iframeを使う方法のみ上手くいったのでメモ。
参考:Form Submit 後に画面遷移をさせない方法
formタグのtarget属性にiframeを指定。
formタグのtarget属性は送信結果をどのフレーム(ウィンドウ)に表示するのかを指定するもの。
https://www.tagindex.com/html_tag/form/form_target.html
index.html
<form method="post" id="form" action="/api/upload" target="sendPhoto">
<input type="file" capture="camera" accept="image/*" id="file-image">
<button class="btn-send">送信</button>
</form>
<iframe name="sendPhoto" style="width:0px;height:0px;border:0px;"></iframe>
script.js
const $form = $('#form')
$('.btn-send').on('click', evt => {
$form.submit()
$form[0].reset()
return false
})
formタグのonsubmitイベントでreturn false
したり、
submitボタンのclickイベントでreturn false
したり、
submitボタンのclickイベントでevent.preventDefault()
したり。
これらは、ページ遷移してしまったり、一見するとAjax通信が成功しているように見えるが中身が送信されていなかったりした失敗例。