2012-01-05 135 views
7

我有一個在Web瀏覽器中運行的遊戲(如插件)和我想要做的是:從關閉到AJAX響應防止網頁瀏覽器返回

  1. 檢測,如果用戶已決定關閉瀏覽器(按Alt + F4,擊中的「X」按鈕等)從關閉

  2. 防止瀏覽器,而我們火到我們的網絡服務的調用來記錄用戶已經關閉了瀏覽器

  3. 一旦我們收到來自Web服務的響應,釋放鎖並允許瀏覽器按要求關閉。

我們想這樣做的主要原因是,我們有一些併發問題,並通過我們的記錄,我們要隔離的人註銷/從哪裏插件已崩潰真正的情況下關閉瀏覽器去。

我看着使用jQuery做這個(爲X瀏覽器的兼容性 - Opera將無法正常工作,但我們不會對任何歌劇反正用戶謝天謝地):

$(window).bind('beforeunload', function(e) { 
    e.preventDefault(); 
    // make AJAX call 
}); 

的問題是,該顯示器向用戶發送一個確認對話框('你確定要離開這個頁面'),用戶可以在發送AJAX呼叫之前確認該對話框。

所以問題是,有沒有辦法阻止瀏覽器關閉,直到收到響應?當頁面被改變時'beforeunload'也會被觸發 - 是否有一種區分點擊鏈接和實際點擊關閉的方法?

感謝任何幫助!

+0

只是出於好奇......如果交換「preventDefault」和「make ajax call」部分,是否有區別? – hugomg 2012-01-05 13:34:54

回答

6

它的棘手的業務,以避免瀏覽器窗口beeing關閉。實際上,沒有辦法這樣做,除了返回onbeforeunload事件的非undefined值之外,就像您所描述的那樣。

我可以提出一個可能的建議,那就是在onbeforeunload事件中創建一個同步的 ajax請求。例如,

window.onbeforeunload = function() { 
    $.ajax({ 
     url: '/foo', 
     type: 'GET', 
     async: false, 
     timeout: 4000 
    }); 
}; 

理論上,這會阻止瀏覽器最多4秒。實際上,瀏覽器會以不同的方式對待它。例如,Firefox(我在9上測試過它)確實不會立即關閉窗口,但它也不會考慮那裏的超時值。我猜在請求被取消之前,窗口/選項卡被關閉之前,內部最大值爲2秒。不過,在大多數情況下,我認爲這應該足夠了。

您的其他問題(如何區分單擊鏈接)很簡單。如上所述,onbeforeunload看起來是從它的事件處理程序返回的。所以,讓我們假設我們有一個變量,它是對我們的應用全球,我們可以做這樣的事情

var globalIndicator = true; 

// ... lots of code 

window.onbeforeunload = function() { 
    return globalIndicator; 
}; 

在這一點上,我們總是收到一個確認對話框時,窗口/標籤即將關閉掉。如果我們想避免任何錨點擊,我們可以修補它像

$('a[href^=http]').on('click', function() { 
    globalIndicator = undefined; 
}); 
+0

感謝Andreas的輸入;所以實際上沒有辦法阻止瀏覽器關閉,直到收到響應爲止......問題是如果播放器連接速度慢, 2秒可能不足以撥打電話。感謝您對區分點擊鏈接的解釋 - 最有幫助 – csdev86 2012-01-05 14:44:42

+0

如果您考慮如何使用它,很明顯,沒有瀏覽器會在關閉之前允許任意長時間阻止頁面。如果可能的話,有人可以製作一個用戶無法關閉的彈出式廣告。 – smorgan 2012-01-05 15:11:28

0

我敢肯定,你想要的是不可能使用JavaScript。但既然你有一個瀏覽器插件,你不應該能夠檢查你的插件對象是否被正確清理?我不確定你是否使用ActiveX,NPAPI或類似Firebreath的東西,但是這些框架都有生命週期方法,在正常關閉的情況下,你的插件會被調用,所以你應該可以寫一些東西給記錄在這一點上。如果插件崩潰,這些將不會被調用。

+0

我們無法可靠地從插件調用這個事實,這就是爲什麼開始從Web瀏覽器開始考慮的原因。 – csdev86 2012-01-05 14:59:43

1

至於你的問題的第一部分,有阻止瀏覽器關閉除使用window.onbeforeunload沒有可靠的方法。瀏覽器在那裏爲用戶提供服務,如果用戶選擇關閉他的瀏覽器,那麼它會這樣做。

關於第二個問題,這是相當容易區別於其他事件鏈接的點擊觸發onbeforeunload事件的jQuery:

$('a').click(function(e) {...}); 

您可以使用此功能,例如,以確保點擊不會觸發unbeforeunload

$('a').click(function(e) {window.onbeforeunload = null}); 
1

您可以使用下面的代碼,以防止瀏覽器越來越封閉: -

window.onbeforeunload = function() { 

//Your code goes here. 

    return ""; 
} 

現在,當用戶關閉瀏覽器,然後他得到確認對話,因爲返回「」; &等待用戶確認&該等待時間使請求到達服務器。

相關問題