2012-07-03 73 views
5

我有一個Flash遊戲,我試圖保存用戶關閉瀏覽器選項卡時的狀態。它是使用以下的jquery代碼:如何製作跨瀏覽器的窗口卸載請求?

//Called from Flash when window closes 
function sendRequest(url, params) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: url, 
     data: params 
    }) 
} 

$(window).unload(function() { 
    //Make Flash attempt to save the game when the window closes. 
    //Flash gets the necessary data and calls sendRequest() 
    document["flashGame"].saveBeforeUnload(); 
}); 
  • 火狐:正常工作
  • 鉻:正常工作時重裝但不是當閉合翼片關閉瀏覽器
  • IE(所有版本):根本不起作用

I wan它可以正確地在所有瀏覽器中工作,但最重要的是Chrome(我們的用戶不是很多都有IE)。

Flash正確地調用了sendRequest(在所有瀏覽器中都使用警報測試過),所以我不認爲這些問題來自Flash,但它可能會發生。

+1

我不認爲你可以也不會做我認爲你應該依靠.unload,如果用戶想關閉瀏覽器他們想關閉瀏覽器。如果瀏覽器等待,您的請求是否需要超過幾毫秒才能完成保存?爲什麼不保存遊戲說30秒定時器,以便他們最長時間會出30秒,那麼你不必擔心卸載事件 – dstarh

+0

@dstarh:我們已經將遊戲保存在計時器上。這樣做的目的是防止玩家失去最後幾秒的行動。通常,這些最後幾項行動很重要。 – Fragsworth

+1

所以你說,點擊X關閉瀏覽器窗口的人應該期望他們在過去幾秒內完成的所有工作都應該保存下來?我認爲培訓用戶點擊一個保存按鈕,然後關閉瀏覽器花費的時間會更多。我們需要讓用戶擺脫「我把電源線從牆上拔下來,爲什麼沒有一切能夠節約!!!」 – dstarh

回答

6

簡短的答案是,你不能。

onbeforeunload事件最初由Microsoft引入,以允許使用標準確認對話框。現在,大多數瀏覽器都支持它的原始形式,並且在大多數情況下允許執行一個簡短的非交互式功能(例如,您可以在localStorage中記錄您的狀態)。但是,正如the cross-browser jQuery API描述,這是不可靠的:

卸載事件的精確處理已從版本變化到 版本的瀏覽器。例如,某些版本的Firefox在遵循鏈接時會觸發 事件,但當窗口關閉時不會觸發該事件。在 的實際用法中,應在所有支持的瀏覽器上測試行爲, 並與專有的beforeunload事件進行對比。

由於有相關的任務的執行許多潛在的安全問題,當用戶要求結束的頁面(因此腳本),這將可能是不可靠的,直到(如果)一個嚴重的標準化努​​力是準確地確定在onbeforeunload回調中可以做些什麼。

對於可預見的未來,建議不要依賴於onbeforeunload,而是使用其他方案,例如不斷後臺保存或大量「保存」按鈕。

1

嘗試window.onbeforeunload。我發現這在jQueryBug Tracker作爲一種可能的解決方案:

window.onbeforeunload = function() { return "text"; }