2012-01-03 17 views
1

window.onbeforeunload関数でAJAXを使用して、自分のサイトのページにあるテキストフィールドを自動保存しようとしています(保存ボタンはありません。 )。保存機能はPHPで書かれています。私は試みることによって開始し、以下:onbeforeunloadでAJAXを使用してフィールドデータを自動保存する

window.onbeforeunload = function(e){ 
    var noteelement = document.getElementById('note'); 
    var mynote = noteelement.value; 

    $.post('save_my_note.php', { thenote: mynote }, function(data){}); 
    }; 

研究には、私は窓からオフ機能が起動する前に閉じているために起因AJAX呼び出しの非同期性に、PHPのコードが呼び出されないことを理解するようになりましたサーバ。

もちろん、他の人が言っているように、onbeforeunload関数に戻り値を追加してダイアログボックスをポップアップさせると(「あなたは本当に残しておきますか?」)、それは

$.post('save_my_note.php', { thenote: mynote }, function(data){}); 
    return mynote; 
    }; 

私が関数はに機能を待っように非同期AJAXにこの記事の呼び出しを変更する必要があることを言われています]ダイアログボックスが応答を待つ間、.postコールが実行取得する時間を持っています完全ではありますが、構文に精通しているわけではありませんが、私が必要とする構文についてはあまりよく分かりません。私はポスト機能の代わりに以下を試した:

 $.ajax({ 
      url: "save_my_note.php", 
      data: "{thenote: mynote}", 
      async: false     
     }); 

しかし、それだけでは動作していないようです。

onbeforeunload(またはonunload ??)関数を使用して自動保存を同期的に実装するための簡単なコード例はありますか?私はjavascriptやjqueryのエキスパートではなく、私がオンラインで見つけた例は混乱しています。

+0

最後のコードスニペットに 'async:false'と入力することを意味しましたか? – Ivan

+1

答えを得るためにこの質問を参照してください:http://stackoverflow.com/questions/2970782/javascript-wait-until-ajax-request-finishes-to-close-page – Ivan

+0

モバイルブラウザでonbeforeunloadが起動しないことに注意してください。モバイル市場のケータリングをしている場合には、別の方法で対応する必要があるかもしれません。 –

答えて

0

たぶん、あなたはタイムアウト一時停止を強制することができ - これは単なる推測で、実際にうまくいく場合は知らん:

var bSaved = false; 
window.onbeforeunload = function(e){ 
    bSaved = false; 
    var noteelement = document.getElementById('note'); 
    var mynote = noteelement.value; 

    $.post('save_my_note.php', { thenote: mynote }, function(data){ bSaved = true; }); 

    window.setTimeout('bSaved = true',2000); 

    while (!bSaved) {} 

    }; 
+0

これをajaxに変更し、asyncを使用すると読んだことがあります:trueを指定すると、サーバーサイドのコードが一時停止し、私はそれを動かすことができません。タイムアウトは無駄になる可能性が高く、クローズする前にすべてのページに強制待ち時間を追加します。 –

+0

これは必須の時刻ではなく、むしろ最大限のタイムアウトです。サーバーが戻ったとき、または2秒後のいずれか早い方で、ページがアンロードされます。 –

+1

@MattHタイムアウト(および成功のコールバック)は、whileループ内で永久にスタックされるため、決して起動されません。 – Paul

2

あなたの最後の例は動作するはずです、あなたは(余分な時間async: falseasynch: falseを変更する必要があります削除する必要があります)according to jQuery documentation

関連する問題