我正在尝试通过JSON / jQuery列出最近活跃的用户。但是,这个计数系统没有按预期工作。它既列出了用户又给出了“无活动用户”消息。我怎么能解决这个问题?
谢谢!
抓取活跃用户的PHP代码:
$liveView_single = array();
$liveView_array = array();
while ($row = mysqli_fetch_assoc($result)){
extract($row);
$liveView_single['id'] = $id;
$liveView_single['type'] = $type;
$liveView_single['username'] = $username;
$liveView_single['lastip'] = $lastip;
$liveView_single['lastactivitypage'] = $lastactivitypage;
$liveView_full[] = $liveView_single;
}
echo(json_encode($liveView_full));
?>
抓取JSON元素的jQuery
<script type="text/javascript">
//counter for number of JSON elements
var i=0;
//show active users function
function showActiveUsers(){
$('#content').html('');
$('#noActiveUsers').html('');
$.get("array.php", function (activeUsersList) {
$.each(activeUsersList, function (a, b) {
$("#content").append("<tr class=\"userRow\" style=\"display:none\">" + "<td class=\"userId\">" + b.id + "</td>"
"<td class=\"type\">" + b.type + "</td>"
"<td class=\"username\">" + b.username + "</td>"
"<td class=\"lastip\">" + b.lastip + "</td>"
"<td class=\"lastActivityPage\">" + b.lastactivitypage + "</td>" + "</tr>");
$(".userRow").show();
//add to counter of JSON elements
i++;
});
}, "json");
if (i == 0){
$('#heading').hide();
$('#noActiveUsers').append('<h2>There are no active users.</h2>');
$('#noActiveUsers').show('slow');
}
//reset timer
setTimeout("showActiveUsers()", 3000);
}
$(document).ready(function() {
showActiveUsers();
});
</script>
答案 0 :(得分:1)
默认情况下,Ajax请求是异步执行的(因此名称为ajax)。该脚本向服务器发出ajax请求,并立即继续使用脚本(if(i==0)
)。数据准备就绪后,它将继续使用成功函数(function (activeUsersList)
)。要解决此问题,您可以使ajax请求同步(但在这种情况下没有理由;请参阅the docs如何执行此操作)。另一种方法是将“无用户在线消息”移动到回调函数中。这更合乎逻辑,因为您需要来自ajax请求的数据才能正确判断是否有用户在线。
在以下示例中,我删除了i
并添加了将if (i == 0)
块移到回调函数中。
$.get("array.php", function (activeUsersList) {
$.each(activeUsersList, function (a, b) {
$("#content").append("<tr class=\"userRow\" style=\"display:none\">" +
"<td class=\"userId\">" + b.id + "</td>" +
"<td class=\"type\">" + b.type + "</td>" +
"<td class=\"username\">" + b.username + "</td>" +
"<td class=\"lastip\">" + b.lastip + "</td>" +
"<td class=\"lastActivityPage\">" + b.lastactivitypage + "</td>" +
"</tr>");
$(".userRow").show();
//add to counter of JSON elements
});
//Move this into the callback function.
if( activeUsersList.length == 0 ) {
$('#heading').hide();
$('#noActiveUsers').append('<h2>There are no active users.</h2>');
$('#noActiveUsers').show('slow');
}
}, "json");