2014-01-20 71 views
8

補充:我不能使用jQuery。我正在使用一個西門子S7控制單元,它具有一個甚至不能處理80kB jQuery文件的小型網絡服務器,所以我只能使用本地Javascript。從這個鏈接Ajax request with JQuery on page unload我得到,我需要使請求同步,而不是異步。這可以用原生Javascript完成嗎?在卸載/ beforeunload時發送帶有Javascript的帖子請求。那可能嗎?

我從這裏複製的代碼:JavaScript post request like a form submit

我在想,如果我可以稱之爲上關閉窗口/標籤/離開與jQuery beforeunload或卸載該網站。應該可以吧?

function post_to_url(path, params, method) { 
    method = method || "post"; // Set method to post by default if not specified. 

    // The rest of this code assumes you are not using a library. 
    // It can be made less wordy if you use one. 
    var form = document.createElement("form"); 
    form.setAttribute("method", method); 
    form.setAttribute("action", path); 

    for(var key in params) { 
     if(params.hasOwnProperty(key)) { 
      var hiddenField = document.createElement("input"); 
      hiddenField.setAttribute("type", "hidden"); 
      hiddenField.setAttribute("name", key); 
      hiddenField.setAttribute("value", params[key]); 

      form.appendChild(hiddenField); 
     } 
    } 

    document.body.appendChild(form); 
    form.submit(); 
} 

回答

4

下面是做到這一點的一種方法:

<body onunload="Exit()" onbeforeunload="Exit()"> 
    <script type="text/javascript"> 
     function Exit() 
     { 
      Stop(); 
      document.body.onunload  = ""; 
      document.body.onbeforeunload = ""; 
      // Make sure it is not sent twice 
     } 
     function Stop() 
     { 
      var request = new XMLHttpRequest(); 
      request.open("POST","some_path",false); 
      request.setRequestHeader("content-type","application/x-www-form-urlencoded"); 
      request.send("some_arg="+some_arg); 
     } 
    </script> 
</body> 

注意,請求可能必須是同步的(叫request.openasync=false)。的關注

一個額外顯着的點:

如果客戶端突然終止(例如,瀏覽器被關閉了「結束進程」或「掉電」),則既沒有onunload事件也不是onbeforeunload將被觸發,並且該請求不會被髮送到服務器。