2017-02-12 23 views
2

我想從AJAX請求獲取一些實時輸出。jquery AJAX直播輸出?

這是我使用的代碼:

$.ajax({ type: "GET", 
    url: "test.php?delete=students", 
    async: true, 
    success : function(data) { 
     console.log(data) 
    } 
    }); 

當通過鏈接我的網頁上觸發顯示一個旋轉的動畫顯示,事情正在發生。我還想在運行時顯示test.php的輸出div

test.php的有一個簡單的循環,其循環遍歷所有的學生和刪除它們,然後它echo "$student removed";

從命令行清除顯示運行時通過AJAX運行我只得到了動畫不輸出。

我不知道如何得到這個,我已經嘗試了幾個插件,取得了很大的成功。我也試過使用XMLHttpRequestresponseText,但我不知道如何正確使用它。

理想情況下,我希望每個移除都會在#status div中顯示。

任何一個可以告訴我如何做到這一點?

UPDATE

progress : function(data) { 
    console.log(data); 
}, 

我已經添加了上述和移動我在控制檯中一些輸出。 ProgressEvent {isTrusted: true, lengthComputable: false, loaded: 44, total: 0, type: "progress"…}

擴大我可以看到包含我後面的數據的responsetext。 如何獲取這樣我就可以將其追加到div

+0

如果我是正確的,AJAX中的「成功」只會在PHP關閉HTTP連接後調用回調函數,我自己也很困惑,所以希望得到更多的回覆。 – Pbd

+0

嗨。 '成功'確實返回正確,我試圖得到輸出,因爲它正在發生。只是要更新我原來的帖子 – Tom

+0

我的意思是說,你不能流tets.php的進度,瀏覽器將不會讀取任何它直到,PHP連接關閉 – Pbd

回答

0

您可以嘗試使用服務器發送的事件吧:https://html.spec.whatwg.org/multipage/comms.html#server-sent-events

客戶端代碼很簡單:

var sse = new EventSource('test.php?delete=students'); 
sse.addEventListener('message', function(e) { 
    console.log(e.data); 
}, false); 

在你test.php的代碼看起來類似以下內容:

header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 

for ($i = 0; $i < ob_get_level(); $i++) {//for each open buffer 
    ob_end_flush();//close it 
} 

ob_implicit_flush(1);//turn implicit flush on 

//now goes what you called "loops through all students and deletes them" 
while(1) { 
    /*here you post your code that deletes your student*/ 
    $data = "$student removed";//message to send to client confirming deleting of particular student 
    echo "data: ".$data . PHP_EOL;//here you send data to client, it will receive it and handle inside 'message' event handler 
    echo PHP_EOL;//need this just to fulfill the SSE standard 
    sleep(1);//use if need to insert pause between sending new portion of data (better use it to keep your browser safe from too much of messages per second) 
} 

不要忘了在完成刪除學生後打破你的循環=)

+0

嗨,謝謝你,我今天晚些時候會嘗試一下 - 會不會有超時問題?如果test.php需要x分鐘完成會導致任何問題?它可能會刪除或更新100,000條目。 – Tom

+0

如果連接斷開,EventSource會嘗試自動重新打開它。所以你只需要確保你的服務器端邏輯在遠程客戶端斷開連接時停止執行(檢查你的'ignore_user_abort'在php中設置爲'off')。ini是否會有問題),並在連接重新打開後繼續執行上次操作。您也可以在客戶端使用'錯誤'事件處理程序來通知客戶端出現問題。檢查我的答案中的鏈接以獲取有關它的更多信息。 –

+0

對不起,只是設法回到這..我得到的錯誤'EventSource的響應具有不是「文本/事件流」的MIME類型(「文本/ HTML」)。中止連接。' – Tom