使用JavaScript实时更新网页元素时出错

时间:2015-08-11 20:30:24

标签: javascript php jquery

我正在开设一个网页,其中显示了我正在运行的游戏服务器上的在线玩家数量,这是实时更新的。 问题是我可以在游戏服务器中显示在线玩家的数量,但它永远不会更新,并且总是显示加载页面时服务器上的玩家数量,尽管人们每秒都会离开并加入服务器。

这是显示数字的PHP代码(它很简单,仅用于测试):

<?php
    echo "<a id='a1' href='#' class='online'>Loading...</a>";
?>

我正在做的是每秒使用新的在线玩家更新'a1',使用javascript调用一个名为getplayers()的php函数:

<script language="JavaScript">
setInterval(function(){
    document.getElementById("a1").innerHTML = '<?php echo getplayers()?>';
}, 1000);
</script>

函数getplayers()就是这样:

<?php
include "Status.php";
function getplayers() {
    $serverb = new Status("mc.spainpvp.com", '25565');
    return $serverb->online_players;
}
?>

最后,Status.php是一个脚本,可以获取在线玩家的数量以及有关服务器的更多信息,我相信这有效:

<html>
<?php

class Status {

    public $server;
    public $online, $motd, $online_players, $max_players;
    public $error = "OK";
    function __construct($url, $port = '25565') {
        $this->server = array(
            "url" => $url,
            "port" => $port
        );
        if ( $sock = @stream_socket_client('tcp://'.$url.':'.$port, $errno, $errstr, 1) ) {
            $this->online = true;
            fwrite($sock, "\xfe");
            $h = fread($sock, 2048);
            $h = str_replace("\x00", '', $h);
            $h = substr($h, 2);
            $data = explode("\xa7", $h);
            unset($h);
            fclose($sock);
            if (sizeof($data) == 3) {
                $this->motd = $data[0];
                $this->online_players = (int) $data[1];
                $this->max_players = (int) $data[2];
            }
            else {
                $this->error = "Cannot retrieve server info.";
            }
        }
        else {
            $this->online = false;
            $this->error = "Cannot connect to server.";
        }
    }
}
?>
</html>

所以我的问题是,如果有人知道为什么它总是用第一批玩家更新而不是投入新的玩家数量?

1 个答案:

答案 0 :(得分:1)

你不能通过Javascript调用PHP函数。 PHP在请求时在服务器上处理。没有任何PHP代码会在响应中显示,因为它已经处理完毕。

所以你的javascript代码实际上就像:

<script language="JavaScript">
setInterval(function(){
  document.getElementById("a1").innerHTML = 'XXXXX';
}, 1000);
</script>

其中XXXXX是请求时的玩家数量。 所以你的代码每秒都会用静态内容替换innerHTML元素。

如果你想每秒获得新的玩家数量,你需要使用Ajax。 您可以使用XMLHttpRequest自行创建请求,也可以使用某些库,如jQuery和$.ajax方法。 您还需要在提供此类信息的服务器上使用PHP代码。