我想定期检查php脚本的状态并在浏览器上显示它。这是用于发布的jQuery。
$(document).ready(function() {
$("#tempbut").click(function(event){
$('#loader').show();
$('#mainarea').hide('fast');
$.post(
"template.php",
{
guide : $('#guide').val(),
title : $('#title').val()
},
function(data) {
$('#mainarea').empty();
$('#loader').fadeOut('slow');
$('#mainarea').append(data);
$('#mainarea').show('slow');
}
);
});
});
在PHP脚本(未发布)中,我回复诸如"构建请求...","发送请求..."等语句。通知用户进度。如果我没有使用jQuery post,我可以在每个echo之后使用flush()和obflush()显示状态。也许是因为回调在输出之前等待脚本完全执行?
有没有办法修改现有的jQuery .post来做到这一点?我看到一些使用.ajax的例子,但没有.post。
如果.ajax是唯一的方法,我将如何修改此代码?
谢谢!
修改 跑了!希望有人会觉得这很有帮助。 (您可以删除console.log)
的test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>TEST</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge;chrome=1" />
<script src="http://code.jquery.com/jquery-2.1.0.js"></script>
<script>
$.ajax({
url: "test.php",
xhrFields: {
onprogress: function(e) {
console.log(e.target.responseText)
$("body").html(e.target.responseText)
if (e.lengthComputable) {
console.log(e.loaded / e.total * 100 + '%');
}
}
},
success: function(text) {
console.log(text)
$("body").html(text+"<h1>done!</h1>")
}
});
</script>
</head>
<body>
<div id="derp">TEST!</div>
</body>
</html>
test.php的
<?php
for($i = 0; $i<20 ; $i++){
sleep(1);
echo $i."</br>";
flush();
ob_flush();
}
?>
答案 0 :(得分:3)
post是ajax的快捷方式(类型:post),没有什么不同。
获取进度报告有一些方法。我现在最简单的就是将2 ajax请求1发送到同一页面来运行你的php脚本并将状态存储在会话中,将另一个存储到不同页面中从会话中读取状态并将其打印给用户。
更新:
哦,我的错误会话没有写下来,直到php脚本完成。 您可以尝试将状态写入文件并从中读取:task.php
for ($i = 0; $i < 10; $i++) {
echo($i . "<br/>");
file_put_contents('progress', $i);
sleep(2);
}
progress.php
if (file_exists('progress') && is_readable('progress'))
echo file_get_contents('progress');
else
echo(-1);
和脚本:
<script>
$(document).ready(function () {
task();
getProgress();
});
function task() {
$.ajax({
url: 'http://localhost/test/progress/task.php',
success: function (data) {
console.log('Task is over :' + data);
}
});
}
function getProgress() {
$.ajax({
url: 'http://localhost/test/progress/progress.php',
success: function (data) {
data = parseInt(data);
if (data != 9) {
console.log('progress :' + data);
setTimeout(function () {
getProgress();
}, 1000);
}
}
});
}
</script>
BUT是一个多用户环境,会导致问题。
所以你可以做的最好的事情是将状态存储在以下其中一个中: