1

私には奇妙な状況があります。

この fiddleの "Insane" をダブルクリックしてみてください。onreadystatechangeが3 回呼び出されていることがわかります。これらすべての時間readyState = 4。私にとって、これは正気ではありません。

しかし、このフィドルalert(added)に示されているように、ダブルクリックイベントリスナー関数からを削除すると、すべて問題ありません。

何が起こったのか私に説明できる人はいますか?それは私にとって非常に奇妙です。よろしくお願いします。:)

4

2 に答える 2

5

これは、XMLHttpRequest が非同期alert('added')実行するように設定されていて、XMLHttpRequestが呼び出しを開始する前に JavaScript 実行スレッドを停止したために発生していonreadystatechangeます。アラートを閉じるまでに、XMLHttpRequest はすでに完了しており、4 つの呼び出しがonreadystatechangeスタックに残っており、実行が保留されています。

したがって、あなたの XMLHttpRequest はすでに完了していて、すでに.readyStateおよびと.status等しいからです。したがって、各呼び出しで、ステートメントは true と評価されます。4200.onreadystatechangeif

XMLHttpRequest を同期的に実行するように変更した場合 (またはalert('added')AJAX を呼び出す前に配置した場合)、予想される数のアラートを取得します。

http://jsfiddle.net/B9a5G/6/

JavaScript イベント、タイミング、およびシングルスレッド処理の詳細:

http://javascript.info/tutorial/events-and-timing-depth

于 2012-08-20T21:26:41.717 に答える
0


最も簡単な方法は、この
関数 myCallback() {
if (g_xmlHttpRequest.readyState != 4)
return;のように readyState を確認した後にアラートを記述することです。
alert("myCallback");
// コードを追加
}

于 2012-12-05T23:21:46.290 に答える