11

の呼び出しを含む、さまざまな JavaScript コードを実行するページがありますsetTimeout()。ユーザーがリンクをクリックして別のページに移動した場合、このページの JavaScript はどの時点で実行を停止し、setTimeout によって呼び出されたコードは呼び出されなくなりますか? 例えば

  • リンクがクリックされるとすぐに (私はこれが間違っていることを知っています)
  • ブラウザが新しいページの受信を開始したとき
  • 他のポイントは?

また、これは主要なブラウザごとに異なりますか?

バックグラウンド

特定の問題を解決するためではなく、主に興味のためにこれを知りたい. これについて考えるようになった問題は、ユーザーがページ上の特定のリンクをクリックしたときに何かをしたいということです。ajax 呼び出しを実行して結果を処理したいのですが、ページがアンロードされる前に終了してもあまり気にしません。したがって、リンクのクリックで setTimeout() を起動し、運が良ければ終了しますが、そうでない場合は終了しません。どのような状況で機能するのだろうかと考えました。その問題には他の解決策があるかもしれませんが、問題の解決策は望んでいません。質問に対する答えだけを知りたいのです。

4

2 に答える 2

3

何が起こるかのシーケンスは次のとおりです。

ステップ 1: リンクをクリックします。ここで、ブラウザはサーバーにリクエストを送信し、レスポンスを待ちます。現在のページのドキュメント オブジェクトはまだ存在します。

ステップ 2: ブラウザーが応答を受信します。現在のページのドキュメント オブジェクトはまだ存在します。

ステップ 3: ブラウザーは、新しいドキュメント オブジェクトへの応答を解析、作成、およびレンダリングします。

ステップ 3 は、現在のページの JS が停止するときです。たとえば、iframe への応答をターゲットにしている場合を除きます。これを行うと、新しいドキュメント オブジェクトが iframe 内にレンダリングされ、現在のページのドキュメント オブジェクトはそのまま残り、JS は引き続き機能します。

それがあなたの質問に答えることを願っています!

于 2013-05-10T08:52:58.960 に答える
0

考えられる解決策の 1 つは、クリック イベントを停止し、非同期呼び出しを開始して、ajax 呼び出しの結果が処理されたときにデフォルト イベントを再開することです。または、可能であれば、サーバーで処理を処理することもできます。この場合、デフォルト イベントを停止する必要さえありません。非同期呼び出しを開始するだけです。

あなたの質問への回答として、 onunload イベントの後にスクリプトが実行を停止するというジャックの意見に同意します。

これが役立つことを願っています。

于 2013-05-10T08:21:53.563 に答える