1 回答

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
我讓你的代碼正常工作,有 2 個(gè)錯(cuò)誤。首先,在你的 while 循環(huán)中,你的函數(shù)名不正確,試試這個(gè):
progress_msg($count, "working... ." . $count . "%");
其次,最后一行不輸出任何內(nèi)容,因此從技術(shù)上講,您不會(huì)得到“成功”的 json 返回。將服務(wù)器腳本的最后一行更改為:
return json_encode($array);
到:
echo json_encode($array);
更新:帶有hacky解決方案的完整工作代碼:
阿賈克斯:
$( document ).ready(function(e) {
var jsonResponse = '', lastResponseLen = false;
$("#btn_search").click(function(e){
var firstname = document.getElementById('firstname').value;
var lastname = document.getElementById('lastname').value;
$.ajax({
type: "POST",
url: 'search.php',
data: $('#search_fields').serialize(),
xhrFields: {
onprogress: function(e) {
var thisResponse, response = e.currentTarget.response;
if(lastResponseLen === false) {
thisResponse = response;
lastResponseLen = response.length;
} else {
thisResponse = response.substring(lastResponseLen);
lastResponseLen = response.length;
}
jsonResponse = JSON.parse(thisResponse);
document.getElementById('progress').innerHTML = 'Progress: '+jsonResponse.msg;
}
},
success: function(data) {
console.log('done!');
dataObjects = data.split("{");
finalResult = "{" + dataObjects[dataObjects.length - 1];
jsonResponse = JSON.parse(finalResult);
document.getElementById('progress').innerHTML = 'Complete!';
document.getElementById('results').innerHTML = jsonResponse.msg;
}
});
e.preventDefault();
});
搜索.php:
<?php
function progress_msg($progress, $message){
echo json_encode(array('progress' => $progress, 'msg' => $message));
flush();
ob_flush();
}
$array = array('msg' => 'hello world');
$count = 0;
while($count <= 100){
progress_msg($count, "working... " . $count . "%");
$count += 10;
sleep(1);
}
ob_flush();
flush();
ob_end_clean();
echo json_encode($array);
?>
ajax 調(diào)用的“成功”方法的問題在于它無法將返回的數(shù)據(jù)解釋為 JSON,因?yàn)橥暾姆祷厥牵?/p>
{"progress":0,"msg":"working... 0%"}{"progress":10,"msg":"working... 10%"}{"progress":20,"msg":"working... 20%"}{"progress":30,"msg":"working... 30%"}{"progress":40,"msg":"working... 40%"}{"progress":50,"msg":"working... 50%"}{"progress":60,"msg":"working... 60%"}{"progress":70,"msg":"working... 70%"}{"progress":80,"msg":"working... 80%"}{"progress":90,"msg":"working... 90%"}{"progress":100,"msg":"working... 100%"}{"msg":"hello world"}
這不是一個(gè)有效的 JSON 對(duì)象,而是一個(gè)接一個(gè)的多個(gè) JSON 對(duì)象。
我嘗試使用 刪除所有以前的輸出ob_end_clean();,但由于某種原因我無法弄清楚,它在我的設(shè)置中不起作用。因此,相反,我想出的 hacky 解決方案是不將返回視為 JSON(通過dataType從 AJAX 調(diào)用中刪除參數(shù)),并簡(jiǎn)單地用字符串操作拆分出最終的 Json 元素......
必須有一個(gè)更簡(jiǎn)單的解決方案,但如果不使用 XHR 和 Ajax 的第三方 jQuery 庫(kù),我找不到任何解決方案。
- 1 回答
- 0 關(guān)注
- 587 瀏覽
添加回答
舉報(bào)