2009-11-18 60 views
1

我想在'beforeunload'事件上對服務器進行JSONP調用。這一切都很好,直到我開始使用後退按鈕。如果我離開頁面,然後在下次調用beforeunload事件時按'返回',它看起來會生成JSONP請求,但服務器永遠不會收到它。JSONP + onbeforeunload +後退按鈕+問題

注意(1):已經在IE和FF上測試過(兩者都出現問題)。 (2):我也測試過使用jQuery.getJSON方法,它有同樣的問題,所以我認爲makeJSONPCall函數是正確的。 (我可能是錯的)

任何想法的人?

一些代碼方面:

JSONP CALL:

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);  
} 

感謝

回答

0

這一事件是種古怪。你可能最終決定不使用它。首先,確保你正在製作同步帖子。接下來,您可能需要向用戶展示用戶界面,以防止瀏覽器過快更改位置。我曾經使用過類似下面這樣的東西,但它最終還是以不同的方式做事。

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."; 
       } 
      } 
+0

感謝您的及時迴應克里斯。不幸的是,作爲公用事業腳本,我不能在人們的網頁上發佈警報。我其實並不認爲這裏有解決方案,因爲在我收到服務器回覆之前,我無法在beforeunload事件中「等待」。 謝謝反正 – gatapia 2009-11-19 00:04:39

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

我很感激上要放什麼東西在循環的想法意見。我採取了一些選項考慮:

  • 大數
  • 訪問的localStorage(同步調用,IO操作)
  • 訪問DOM
  • 同步AJAX調用(但我不就來了數學浪費CPU t想要在不使用它的腳本中包含ajax代碼)

任何想法?