我正在尝试从$ .ajax电话中收集进度信息。
$.ajax({
type: 'POST',
url: '/site/search',
data: {query:"test"},
dataType: 'JSON',
xhr: function(){
var xhr = new window.XMLHttpRequest();
//Upload progress
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
//Do something with upload progress
console.log('upload event: ' + percentComplete * 100);
}
}, false);
//Download progress
xhr.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
//Do something with download progress
console.log('download event: ' + percentComplete * 100);
} else {
console.log('error computing');
console.log(event);
}
}, false);
return xhr;
},
success: function(result){
console.log(result);
},
});
ajax调用是从输入字段的keyup事件发出的,用于将字段的当前值发送到php文件以解释和处理搜索。目前,正在使用虚拟数据。
这是PHP: public function actionSearch(){ $ query = $ _POST ['query'];
$test = array();
for($i=0; $i<80; $i++){
$test[$i] = array(
'id'=>$i,
'first_name'=>'test' . $i,
'last_name'=>'tester' . $i,
'email'=>'tester' . $i . "@email.com",
'special'=>$i * 3.14,
);
}
echo json_encode($test);
}
此时,当进行调用时,它成功返回对象的json对象(用于表示记录),并且ajax正确地将进度值记录到控制台。
问题在于:如果我尝试返回超过80条记录,则ajax事件的lengthComputable设置为false,并且我没有获得进度百分比。
我假设基于我正在处理响应大小太大问题的记录数量的任意性质,但我不知道如何处理它。我已经测试了超过300个对象的响应,并且它加载得很好,但我真的想要进度值。
我有两种方法可以同时拥有它们吗?
谢谢!