Jquery - 计算JSON元素

时间:2013-07-13 12:04:37

标签: jquery ajax json

我正在尝试通过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>

1 个答案:

答案 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");