0

次のコードを使用して、サーバー上のスクリプトにアクションとパラメーターを送信します。

$(function() {
    url = "http://...../myscript.php";
    $.post(url, { action: 'my action', param: 'my parameter'}, {cache: false});
    alert("Hello");
});

(MacOSX の Safari 6.0.4 で) アラート ボックスがポップアップし、[OK] をクリックした後にのみ ajax 要求が送信されることに気付きました。(Chrome では、アラートが表示されている間にリクエストが送信されます)。

したがって、私のajaxリクエストに続くコードは、実際にはリクエストの送信を遅らせます。

どうしてこれなの?

編集:

$.post(url, { action: 'system', param: 'volume get 5'}, {cache: false});
sum = 0;
for(i = 0; i < 1000000000; i++)
    sum++;
$("title").html(sum);

計算が完了した後にリクエストが送信されるようにします。

4

1 に答える 1

2

(MacOSX の Safari 6.0.4 で) アラート ボックスがポップアップし、[OK] をクリックした後にのみ ajax 要求が送信されることに気付きました。(Chrome では、アラートが表示されている間にリクエストが送信されます)。

したがって、私のajaxリクエストに続くコードは、実際にはリクエストの送信を遅らせます。

これは非常に驚くべきことですが、私は Mac OS X を持っていないのでテストできません。alertはメインの JavaScript スレッドをブロックしますが、ブラウザがマルチスレッドであるため、ブラウザがリクエストを送信するのを妨げるべきではありません。しかし、一部の実装では可能だと思います。

alertとにかく、リクエストに関連付けられた「成功」または「エラー」ハンドラーへの呼び出しを保留することに注意してください。これはまったく別のものです。これは、Web ワーカーを使用しない限り、JavaScript はブラウザー上でシングルスレッド化され、(再び) alert1 つの JavaScript スレッドを保持するためです。

によって送信が実際に滞っている場合はalert、次の方法で修正できますsetTimeout

$(function() {
    url = "http://...../myscript.php";
    $.post(url, { action: 'my action', param: 'my parameter'}, {cache: false});
    setTimeout(function() { alert("Hello"); }, 0); // Defers it
});

保留されているのがコールバックである場合、それに対処する最善の方法は、メッセージを含む適切なalertスタイルの絶対配置など、よりも現代的なことを行うことです。divメッセージをモーダルにしたい場合は、自分でそれを行うことができますが、ページの残りの部分を無効にするいくつかのエッジ条件があります。しかし、これらのエッジ条件を処理する jQuery 用の「モーダル」プラグインも約 100 万個あります。(jQuery UI と Bootstrap の両方が提供しており、他にもたくさんあります。)

于 2013-05-28T15:06:58.497 に答える