2011-11-05 63 views
1

我發現這種方法偶爾工作,但通常根本不起作用。如何發送窗口卸載AJAX請求,而不必等待迴應

$(window).unload(function() 
{ 
    $.ajax 
    ({ 
     url: "script.php", 
     type: "POST", 
     data: 
     { 
      value: value 
     } 
    }); 
}); 

設置異步爲假(即'async' : false)不得到解決的問題,並執行PHP腳本每次。但取決於腳本,它可以暫時凍結瀏覽器。

有沒有一種很好的方式將數據發送到php腳本並讓服務器在沒有用戶等待響應的情況下執行它?

EDIT - 我對客戶端 - 服務器交互的理解很生疏,但並不是發送請求需要很長時間,而是處理請求發送的數據。我想知道如果沒有用戶必須在頁面上進行處理。

回答

4

您需要在服務器端通過關閉連接並繼續處理數據來完成此操作。在PHP它會是這個樣子?

<?php 
    header("Content-Length: 0"); 
    header("Connection: close"); 
    flush(); 

//At this point the request is finished and you can continue to process the data. 
//Keep in mind the connection is now closed and you can no longer return any information to the user. 

>

注意這不是技術上發射一個後臺任務,所以你應該罰款共享的主機上這樣做。只要它不會持續特別長的時間。

+0

感謝您的回答。但它並沒有解決問題。數據仍未保存。我還注意到,它偶爾保存在域內的鏈接中,但是當用戶關閉窗口時,它永遠不會保存。 –

+0

你還有async設置爲false嗎?因爲如果沒有,您可能會在發送所有數據之前終止請求。 –

+0

這應該強調更多,異步**需要**設置爲false才能使其工作。異步請求將被瀏覽器的默認行爲取消,因此可能會或可能無法工作。例如 - 如果服務器在瀏覽器刷新/關閉完成之前返回響應,則它可以工作,但大多數情況下會調用取消請求。然後這一切都取決於瀏覽器在這種情況下的行爲 - 在我的測試中,使用FF進行的請求往往會被計算,而使用Chrome進行的請求則不會。 – eithed

0

我還沒有嘗試,但也許你可以添加一個超時(一個小值),或中止請求後發送它(與.abort()方法)。

1

我不會這麼想。瀏覽器正在關閉,因此它試圖關閉所有連接。我不知道如何發送請求而沒有讓用戶等待。你幾乎要求它在後臺工作。

我會堅持async: false,但可能會通知用戶Please wait...消息或類似消息。測試你的目標瀏覽器,因爲它似乎有點麻煩,不能關閉瀏覽器/標籤,並等待ajax調用完成。

+0

我對客戶端 - 服務器交互的理解很生疏,但並不是發送請求需要很長時間的請求,而是處理請求發送的數據。我想知道,如果沒有用戶必須在頁面上進行該處理 –

+0

@ user745434我會觸發在您的服務器上啓動後臺任務的請求。這意味着服務器在響應被髮送回瀏覽器之後會繼續工作。 – Marko

+0

我會研究這個。這是一個共享主機,所以我不知道它是否可能。謝謝Marko –