2014-02-26 96 views
1

在我們的Web應用程序中,當用戶退出/關閉窗口時,必須使用連接了'kill'操作的ajax調用服務器。然而,無論是卸載/ pagehide事件不會被解僱,或者沒有被執行Ajax調用和我一直不能確定,爲什麼...Javascript - 在卸載/頁面隱藏事件中調用AJAX

語境:

  • 不幸的是,我們必須使用香草js;沒有jQuery。
  • 我很清楚onbeforeunload,但對於各種情況下,ajax調用不能在該事件發生(除非有一些神奇的 黑客,我不知道這抑制了默認彈出框 和/或提供了一種方法看到用戶的迴應)。
  • 我們必須兼容IE7 +,FF14 +。無需支持Chrome,Safari,Opera。
  • 我知道ajax功能的作品 - 它被稱爲無數次,而瀏覽器是積極的,並已經過全面測試。

相關代碼...從.JSP

代碼:從utils的文件

if (window.onpagehide || window.onpagehide === null) { 
    addEvent(window, 'pagehide', kill); 
} else { 
    addEvent(window, 'unload', kill); 
} 

代碼:

function addEvent(obj, evt, fnc) { 

    if (obj.addEventListener) { //W3C 
     obj.addEventListener(evt, fnc, false); 
     return true; 
    } else if (obj.attachEvent) { // MSFT 
     return obj.attachEvent('on' + evt, fnc); 
    } else { // Legacy 

     evt = 'on'+evt; 

     if(typeof obj[evt] === 'function') { 

      // Object already has a function on traditional 
      // Let's wrap it with our own function inside another function 
      fnc = (function(f1, f2) { 
       return function() { 
        f1.apply(this, arguments); 
        f2.apply(this, arguments); 
       } 
      })(obj[evt], fnc); 
     } 

     obj[evt] = fnc; 
     return true; 
    } 

    return false; 
}; 

    function kill() { 

     ajax.post({ 
      "refCallback": null, 
      "sURL": "--deleted--", 
      "async": false, 
      "timeout": 10000, 
      "params": {"op": "kill", 
         "guid": guid}}); 

    }; 

任何見解或指針將是非常有幫助的..

回答

0

這已經有一段時間了,因爲我已經搞砸了onunload d onbeforeunload,但這是我記得的。嘗試使用onunload時,由於卸載頁面的請求已在進行中,因此您有很短的時間來執行任何操作。通常,您需要在onbeforeunload方法內執行代碼。至於你的問題「除非有一些神奇的黑客,我不知道這會抑制默認彈出框和/或提供一種方式來查看用戶響應」,有一種方法可以禁止默認的彈出框,但如果你的意圖是用一個自定義的替換它,你運氣不好。要使彈出框不出現,只需在onbeforeonload調用中不返回任何內容。

我記得我需要做的事情非常類似於你問的東西。我也無法使用JQuery,但是我使用了對jsp的調用來放棄憑據,而不是使用AJAX。我實際上問了Stack Overflow的問題,並自己回答了這個問題:How to logout during onbeforeunload/onunload using Javascript。嘗試用您的AJAX呼叫替換我的jsp調用?

下面是unbeforeunload的一個很好的例子骨架相比onunload的:

​​

上面的代碼是一個答案我有,給我的感覺的結果,是在Show popup window when the browser closeOnUnload Alert Error "NS_ERROR_NOT_AVAILABLE"類似的問題。

即使你使用的是onbeforeunload而不是onunload,如果我沒有記錯的話,如果你不顯示彈出窗口,它將不會執行冗長的代碼。我知道這個答案並不是你正在尋找的東西,但希望它可以引導你走向正確的道路。

+0

我懷疑資源被卸載,但我希望在這些資源被卸載之前快速進行ansyc ajax調用。我最終實施了一項圍繞這項工作的工作(稍微不太優雅)。感謝您的確認/回答! – bcwebb88

0

實際上,可以在頁面隱藏或卸載(不推薦使用但仍在工作)的事件處理程序中執行AJAX請求,但您需要使此請求同步,否則請求只會被Safari拋棄。

window.addEventListener("pagehide", function(evt){ 
    var request = new XMLHttpRequest(); 
    request.open('GET', '/bar/foo.txt', false); // `false` makes the request synchronous 
    request.send(null); 

    if (request.status === 200) { 
    // your request has been sent 
    } 
}, false);