1

onClick特定の へのイベントを取得したとdivしますが、その前に、jQuery で実行する必要がある大きな計算があり、これには 3 秒ほどかかり、jQuery は現在ビジーであるため、私のイベント呼び出しを認識しません。

1 秒経ったので、ボックスをクリックします。何も起こりません?2秒。何も起こりません?3 秒後、jQuery は現在のタスクを完了します。jQueryonclickイベントが機能し、ボックスが消えます。

質問は; この場合、jQuery は何をしますか? onclick イベントを即座に実行するスレッドを自動的に作成しますか? 通話をキューに入れますか? (つまり、タスクが完了すると 3 回のクリックが実行されるため、3 回のイベント呼び出しが実行されます) 最初の 2 回の呼び出しを完全に無視しますか? また、この種の問題を回避するにはどうすればよいですか?

4

3 に答える 3

3

JavaScript は、シングル スレッドであるかのように機能します。一部のブラウザーでは実際の実装が異なることは理解していますが、スクリプトが直線的に実行されることを期待してスクリプトを作成しても安全です。

この質問を見る

ブロックされた UI の間、ブラウザーはクリックをキューに入れると思いますが、そのシナリオを処理する方法を決定するのはブラウザー次第です。(マイ Chrome は、UI がブロックされている間、クリック イベントをキューに入れます)

そうは言っても、新しいブラウザにはクールな機能が実装されています。

ウェブワーカー

これにより、UI をブロックすることなく、バックグラウンドで高価な/長い操作を実行できます。スクリプトがほとんど新しいブラウザで実行される場合は、この機能を掘り下げる価値があるかもしれません。おまけ: この記事は jQuery の創始者によって書かれています。=)

于 2012-12-09T01:14:31.920 に答える
1

バックグラウンドで何かが起こっていることをユーザーに知らせるために、読み込みバーまたはページ更新要素を使用できます。

于 2012-12-09T01:28:19.507 に答える
0

この jsfiddleを見てください。Chrome では、Shad が述べたように、クリックがキューに入れられ、計算が完了するとイベントが処理されます。奇妙なことの1つは、大きな計算の前の行です

E('status').innerHTML = "Status: started";

その後まで実行されないようです。もう 1 つの驚くべきことは、いくつかの操作を 10,000 回または 100,000 回繰り返すだけで、ブラウザー全体をハングアップさせることがいかに簡単かということです。

サーバー側の解決策が不可能な場合、解決策は、計算を操作の小さなバッチに分割し、コードの他の部分が動作できるように、数ミリ秒の間隔で一度に 1 つのバッチを実行することです。それまでの間、「お待ちください」というメッセージが必要になる場合があります。

于 2012-12-09T01:46:33.913 に答える