これはおそらく、通常の「フォーム送信イベントをキャプチャするにはどうすればよいですか?」という質問ではないでしょう。質問。
フォーム送信イベントが jQuery、バニラ Javascript、およびブラウザー (IE/FF/Chrome/Safari/Opera) によってどのように処理されるか、およびそれらの間の関係を正確に理解しようとしています。(私の他の質問を参照してください。 ) 何時間にもわたるグーグル検索と実験の後、不一致または曖昧さのために、私はまだ結論に達することができません。
AJAX 要求が戻ってくるまでフォームを送信できないように、Web サイトのフォームと統合するスクリプトを完成させています。
理想的には:
- ユーザーがフォームに記入する
- フォームが送信されます -- ただし、以前にバインドされたイベント ハンドラーは呼び出されません。
- ハンドラーが API リクエストを作成します (もちろん非同期で)
- ユーザーは API 応答から検証結果を確認します
- フォームの送信は通常どおり自動的に続行され、以前は抑制されていた他のハンドラーが呼び出されます
私の現在の理解は次のとおりです:(これらは間違っている可能性があります。間違っている場合は修正してください)
- jQuery は、フォーム送信イベント ハンドラーを送信ボタン
click
イベントにバインドします。 click
submit 要素イベント (マークアップのようなものでonclick=""
あれ、jQuery を使用してバインドされているものであれ)で直接イベント ハンドラーが最初に実行されます。- フォーム イベントのイベント ハンドラー
submit
(マークアップのようなものでonsubmit=""
あれ、jQuery を使用してバインドされているものであれ) が次に実行されます。 - 呼び出し
$('[type=submit]').click()
はフォームのsubmit
イベントを呼び出さないため、そのハンドラーは呼び出されません - 呼び出し
$('form').submit()
は送信ボタンのclick
イベントを呼び出さないため、そのハンドラーは呼び出されません - それでも、どういうわけか、送信ボタンをクリックするユーザーは、フォームのイベントにバインドされたハンドラーを呼び出すことになります
submit
... (ただし、上記のように、送信ボタンをクリックしても同じことは行われません) - 実際、ユーザーがフォームを送信する方法(送信ボタンまたはEnterキーを押す)では、jQueryでフォームイベントにバインドされたハンドラーが
submit
呼び出されます...
現在、私は:
click
それらへの参照を保持しながら、送信ボタンのイベントにjQueryでバインドされたハンドラーのバインドを解除します- 独自のハンドラーを送信ボタンの
click
イベントにバインドして、最初に実行する onclick=""
andを使用してマークアップにバインドされたハンドラーをonsubmit=""
(それぞれの要素で) 取得し、jQuery を使用してそれらを再バインドし (私の後に実行されるように)、属性を に設定します。null
- ハンドラーを (ステップ 1 から) 再バインドして、最後に実行するようにする
実際、これは私自身のテストで非常に効果的であり、イベント ハンドラーが最初に起動します (必須)。
問題と私の質問:
予想どおり (これまでのところ)、私のハンドラーが最初に起動します。問題は、ハンドラーが非同期であるため、API 要求が完了するまで、それを呼び出したフォームsubmit
または送信ボタンイベントを抑制 (preventDefault/stopPropagation/etc) する必要があることです。click
その後、API リクエストが戻ってきて、すべて問題がなければ、フォーム送信を自動的に再度呼び出す必要があります。しかし、上記の観察から、すべてのイベント ハンドラーが自然なフォーム送信であるかのように起動されるようにするにはどうすればよいでしょうか?
すべてのイベント ハンドラーを取得し、最初に自分のイベント ハンドラーを配置してから、フォーム送信を再度呼び出して、すべてが適切な順序で呼び出されるようにする最もクリーンな方法は何ですか?
$('form').submit()
と の間に違いがあるとすれば、それは何$('form')[0].submit()
ですか? ( と も$('[type=submit]').click()
同様$('[type=submit]')[0].click()
)
tl;dr、Javascript/jQuery/browser form-submit-event-handling に関する標準的で明確なフリーサイズのドキュメントは何ですか? (本のおすすめを探しているわけではありません。)
いくつかの説明: ショッピング カートのチェックアウト ページで多くの Javascript を補正しようとしています。ユーザーがページの下部にあるボタン (送信ボタンではない) をクリックした場合にのみフォームが送信されることがあります。その他のトリッキーなシナリオ。これまでのところ、それはかなり成功しています。実際の問題は、送信を再度呼び出すことです。