2010-06-25 30 views
4

我想控制人們可以輕鬆離開我的應用程序。現在,我知道我不能完全做到這一點。這是cron工作的目的。但我想盡可能多地抓住這些情況。如果OnBeforeUnload接受對話框,它們可以運行代碼嗎?

我想,我可以使用onBeforeUnload來顯示對話框,警告他們離開並請他們請點擊退出按鈕。

但後來我發現當調用onBeforeUnload時可能會運行同步AJAX(heh)調用;正如我所理解的那樣,瀏覽器會在繼續之前等待它完成,這是同步的好處。這樣,我可以告訴服務器,當他們關閉窗口時我正在註銷。因爲它在onBeforeUnload而不是onUnload,所有的數據仍然存在,並且會發送呼叫。

我的問題是,是否有可能將這些結合起來?我想彈出警告他們離開,然後如果他們繼續想離開,發送消息,他們實際上正在離開。

我明白這一點,我不能這樣做;我可以這樣做:

  1. 發送消息僅
  2. 豎起對話框只
  3. 發送把彈出的對話框

消息......但我不能發送如果他們接受對話,有條件的消息,對吧?我的理解是,當他們點擊「確定,我想離開」時,它立即啓動onUnload,到那時已經太晚了。上面的#3沒有用處,因爲我不想發送他們正在註銷的消息,然後讓他們取消對話框並保留在頁面上。

我可以吃我的蛋糕嗎?我可以問他們是否想離開,如果是,發送信息?

+0

不要依賴於'事情,這不是故障安全的:這個非標準的事件不被Opera支持,因此從不觸發。此外,使用任務管理器或其他東西(* nix'kill'命令)來終止瀏覽器也不會觸發此事件。 – 2010-06-25 21:02:50

+0

正如我在文章開頭所說的那樣,我並不打算在瀏覽器上依賴任何東西。這就是服務器端cron作業的目的:捕捉不切實際的關閉。我希望能夠儘可能地優雅,儘可能抓住儘可能多的情況。 – Andrew 2010-06-25 21:33:11

+0

啊,我錯過了那部分。 – 2010-06-26 10:10:08

回答

-1

正如我在評論中所述,onbeforeunload在Opera中不起作用。但是,我在Firefox(3.6.3/Linux)和Chromium(5.0.375.70)中嘗試了以下代碼,它或多或少地起作用。但是,關閉Chromium窗口或選項卡時,會顯示確認框,但即使點擊了Ok,也會在一秒鐘內關閉窗口/選項卡。在onbeforeunload期間似乎有同步XMLHttpRequests超時。

window.onbeforeunload = function() { 
    if (confirm("Send unsaved data?")) 
     sendData(); 

}; 

function sendData() { 
    var request = new XMLHttpRequest(); 
    request.open("POST", "wait.php", false); // false = synchronous request 
    request.send('data={"foo":"bar"}'); 
    if (request.readyState == 4 && request.status == 200) 
     alert("Succes!"); 

} 

更新 - 只是爲了完整起見,我忘了,包括wait.php,它只是擁有10秒的連接:onbeforeunload`這些

<?php sleep(10); ?> 
+0

無論如何,這可能只會在FF和IE中使用,我不會爲我支持Opera和Chrome(它是一個內部應用程序)。但這聽起來有點粗略。基於我所看到的,我認爲我寧願只是用'cron'扔我的東西。 (同樣,不是說它不會存在*無論如何*,我只是想看看我可以如何優雅地關閉應用程序,似乎沒有太多。) – Andrew 2010-06-26 00:59:41

+0

@Andrew:確實。這只是網絡不是爲了做這些事情而設計的。 – 2010-06-26 10:09:39

相關問題