2013-05-21 18 views
2

我有一個網絡服務器,可以爲特定主題的學生生成問題。網絡服務器需要記錄每個學生花費在一組特定問題上的時間。Onunload,onbeforeunload - 要求提供指導

網頁上有一個「完成」按鈕,當按下該按鈕時,統計數據將被髮送到服務器。

但是,如果學生從頁面導航離開頁面或關閉瀏覽器窗口而不按「完成」,我還希望Web瀏覽器發送統計信息。

爲此,我計劃讓「onunload」或「onbeforeunload」發送一個Ajax請求到服務器並提供相關信息。但顯然不同的瀏覽器並不完全支持這些事件,並且在事件處理程序中可以做什麼也有限制。當然,如果與服務器的通信失敗,我不希望瀏覽器凍結。

所以,我需要一些建議,以最好的方式來做到這一點。

+0

我已經使用onbeforeunload來發送AJAX請求,因爲這個原因,它在主流瀏覽器中工作。我無法給你一個我測試過的最終清單,但你應該知道它已經完成了。 – RichieHindle

+0

我用過的軟件,回想起來,可能有這個功能。我的回憶是,有哪些瀏覽器可以使用的限制。這是不誠實的,但我傾向於採用基本上說的一句話。 「需要符合標準的瀏覽器,您必須使用xx,yy或zz瀏覽器來完成此測試,其他瀏覽器無法保證您的答案的隱私性,因此不支持」 – enhzflep

+1

您無法實現某些不受支持的瀏覽器(卸載時的AJAX)。不要在卸載時發送數據,最好定期將數據發送到服務器。然後,即使使用任務管理器關閉了瀏覽器,或者如果(s)他拔掉了(網絡)電纜,您仍然有一些數據。 –

回答

1

如果我想確保處理所有「特殊事件」,我會將網頁上的「請求」打勾發送到服務器。粒度取決於跟蹤需求,負載以及它是Intranet還是Internet應用程序;可以是幾秒鐘甚至一分鐘。因此,即使瀏覽器/操作系統/網絡崩潰,您也正在追蹤在頁面上花費的時間。

+0

這可能是最好的方法。謝謝你,peterfoldi。 (賞金將在系統允許的幾個小時內頒發。) – oz1cz

1

最好的實施方法是使用期間更新。這幾乎可以確保您在用戶以任何方式斷開連接時都能獲得一些相關數據。

一個實現是非常微不足道的,你可能不得不重構一些邏輯來發送週期更新而不是一次一切。

function sendStatistics() 
{ 
    // ajax and what not 
} 

setInterval(function(){ 
    sendStatistics(); 
}, 1000); 

使其工作的另一種方法是讓您的ajax調用beforeunload並使其同步。這會在通話期間凍結瀏覽器,並且只在瀏覽或關閉瀏覽器時才起作用,我不建議這樣做。

相關問題