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


Error updating webpage elements in real time with JavaScript

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

这是显示数字的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>

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

不能通过Javascript调用PHP函数。PHP在请求时在服务器上进行处理。在响应中没有任何PHP代码是可见的,因为它已经被处理过了。

那么你的javascript代码看起来就像:

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

,其中XXXXX为请求时间内的玩家数量。因此,您的代码将每秒钟用静态内容替换元素innerHTML。

如果你想每秒获得新的玩家数量,你需要使用Ajax。你可以使用XMLHttpRequest创建自己的请求,或者你可以使用一些库,如jQuery和它的$.ajax方法。您还需要服务器上的PHP代码来提供这些信息。