3

誰かが私のページをリロードしたり閉じたりしたときに、進行状況が保存されるようにする必要があります。進行状況を保存するために、POSTviaを実行しXMLHttpRequest()て、データをサーバーに送信します。イベントsaveData()内でこの関数をトリガーしています。window.onbeforeunload

問題は、いくつかの計算を行い、最終的に実際にデータを POST するためにsaveData()a を呼び出すことです。sendData(content)また、処理および送信しているデータが大きい場合 (>100kB)、すべてのデータがサーバーに到達する前にウィンドウが閉じているように見えます。(画像を送信していますが、反対側に半分しか表示されない場合があります)

http リクエストは同期xhr.open("POST", url, false)ですが、それではうまくいかないようです。

だから私の質問は、どうすれば onbeforeunload 関数が UNTIL 終了しないようにすることができxhr.readyState == 4ますか? そのイベントを待機させるにはどうすればよいですか?

ああ、setTimeout()うまくいきません。「時間」になる前にウィンドウが閉じます。

これはうまくいきません:

if (!jQuery) {
    setTimeout(attachCode, 100);
    return;
} else {
    // continue and close
}

洞察をありがとう!

PS: 数秒しかかからず、ユーザーが手動で保存する必要がないため、これは「悪い習慣」ではありません。また、彼が作業中に保存すると (ウィンドウを閉じる前など)、アプリの速度が低下するため、それはできません。

[編集] 一時的な手段として、ユーザーがページにとどまることにした場合、このトリックを使用してデータを自動保存することに頼りました。ただし、警告メッセージを使用する必要はありません。:(

4

2 に答える 2

1

実際には、アンロードする前にブラウザーを遅くすることができます。問題は、JS が ajax リクエストを処理する方法にあります。

かなり前に、ナビゲートする前に、いくつかのものをログに記録するという、ほぼ同じことについて、手早く汚いハックをしなければなりませんでした。私が見つけた唯一の方法は、XHR リクエストの戻り値を待つことです。

同期的ではありますが、コードの実行はバックグラウンドで分岐し、実際にはブラウザーをブロックしません。スクリプトを停止してデータをアップロードするには、戻り値を取得する必要があります。

これにはjQueryを使用しましたが、ネイティブJSに適用されることに注意してください(私は.. :))

/* some code above */
var request = {
    async:false,
    cache: false,
    url: this.serviceURL,
    type: 'POST',
    data: {...},
    success: function(data) {}
};
try {
    var asd = $j.ajax(request); // do the request and wait
}
catch (e) {}
/* some code below */

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

于 2011-02-25T10:46:22.663 に答える
1

ブラウザが通常の動作をすることを禁止することは、通常は悪い考えです。またonbeforeunload、アンロードを一時停止することはできません。ユーザーがページを離れることをユーザーに知らせてから、ページを離れるかどうかを決定させることしかできません。したがって、データは保存されません。

あなたの場合、Googleドキュメントに表示されるように、下書きの自動保存をお勧めします+ユーザーが保存されていないデータでページを離れたときの警告。

于 2011-02-25T10:28:31.877 に答える