1

「beforeunload」イベントでサーバーに JSONP 呼び出しを行おうとしています。戻るボタンでプレイを開始するまで、これはすべてうまく機能します。ページから離れて移動し、次に beforeunload イベントが呼び出されたときに「戻る」を押すと、JSONP 要求を行っているように見えますが、サーバーはそれを受け取りません。

注(1): これは IE と FF でテストされています (問題は両方で発生します)。

注(2): jQuery.getJSON メソッドを使用してテストしたところ、同じ問題が発生したため、makeJSONPCall 関数が正しいと仮定します。(私は間違っているかもしれません)

アイデアはありますか?

コンテキストのコード:

JSONP 呼び出し:

makeJSONPCall('http://serverurl.mvc/method?args=' + data, 'callbackfunction');      

function makeJSONPCall(url, callbackname)
{                
  if (url.indexOf("?") > -1) url += "&jsonp=" 
  else url += "?jsonp=" 
  url += callbackname + "&";
  url += new Date().getTime();
  var script = document.createElement("script");            
  script.setAttribute("id", "JSONP");
  script.setAttribute("src",url);
  script.setAttribute("type","text/javascript");                
  if (document.head) document.head.appendChild(script);
  else document.body.appendChild(script);    
}

ありがとう

4

2 に答える 2

0

私は同様の問題に取り組んでいます-ユーザーがサイトを離れたことに応じてデータを送信する必要があり、私のコードは誰かのページ内の外部リソースとしてそこにあります。何もポップアップできず、電話をかける必要があります。そして、同期できないJSONPを使用する必要があります。

私が理解できたのは次のとおりです。

  • onbeforeunload ハンドラーは、ブラウザーが現在のページを破棄するのをブロックしています
  • 何も返さない場合、ポップアップは表示されません。

したがって、イベント ハンドラーが実行されている限り、コードは機能します。

擬似コード:

window.onbeforeunload = function() {
  startAsynchronousSending();
  //do lots of slow and synchronous stuff to delay destroying the window//
  //return statement deliberately missing
}

現時点ではすでに機能していますが、遅延部分は単なる CPU 集中ループです。違いはありますが(リクエストが送信されるのに十分な時間があります)、より良い遅延を探しています。

参照: http://forums.thedailywtf.com/forums/t/24374.aspx

何をループに入れるかについてのアイデアをコメントしていただければ幸いです。私はいくつかのオプションを考慮しています:

  • CPU を大量に計算するために浪費する
  • localstorage へのアクセス (同期呼び出し、IO 操作)
  • DOM へのアクセス
  • 同期 ajax 呼び出し (ただし、ajax を使用しないスクリプトに ajax のコードを含めたくありません)

何か案は?

于 2012-04-02T09:46:56.450 に答える
0

そのイベントはちょっと風変わりです。最終的には使用しないことにするかもしれません。まず、同期投稿を行っていることを確認してください。次に、ブラウザが場所をすばやく変更しないようにするために、ユーザーに UI を提示する必要があるでしょう。以下のようなものを一度使用しましたが、うまくいきましたが、結局別の方法でやってしまいました。

    window.onbeforeunload = function() {
               // stuff do do before the window is unloaded here.
               if(IsDirty()) {
            //i only want to call ajax if I need to.
                setTimeout(function(){
                    DoAjaxSaveSynchronously (); // this was important
                    ClearDirty();
                        }, 500);
//this return value causes the browser to pop a modal window.
                return "You have unsaved work. Please stay on this page to save your work.";
               }
            }
于 2009-11-18T23:14:26.913 に答える