Javascript 文件更改时刷新页面

Javascript 文件更改时刷新页面,javascript,php,Javascript,Php,我希望javascript在修改服务器上的页面文件时刷新页面 <?php $filename = "test.php"; if (file_exists($filename)) { $dateFile = date("s", filemtime($filename)); $dateOfFile = array('filedate' => "$dateFile"); echo json_encode

我希望javascript在修改服务器上的页面文件时刷新页面

<?php

     $filename = "test.php";

     if (file_exists($filename)) {
          $dateFile = date("s", filemtime($filename));
          $dateOfFile = array('filedate' => "$dateFile"); 

          echo json_encode($dateOfFile);    
     }

?>
我使用api.php(见下文)获取文件的文件修改时间,并将其作为json返回

因此,从api.php获取数据是没有问题的,但是如果是这种情况,我如何在javascript中将旧值与新值进行比较并刷新页面呢

以下是我迄今为止所做的工作:

var oldVar = 0; 

setInterval(function(){ 
$.getJSON('api.php', function(data) {
    console.log(data);

    var obj = data;

    var filedate = obj.filedate;



    if (oldVar != filedate) {
            location.reload();
    };

    var oldVar = filedate;


});
}, 1000); // 1 second
显然,这会使页面每秒刷新一次,但我不知道如何继续

这是我用来获取数据的PHP代码,我使用filemtime检查服务器上的文件修改时间

<?php

     $filename = "test.php";

     if (file_exists($filename)) {
          $dateFile = date("s", filemtime($filename));
          $dateOfFile = array('filedate' => "$dateFile"); 

          echo json_encode($dateOfFile);    
     }

?>

您使用的是
日期(“s”,…)
,它只返回时间的秒部分,即现在我所在时区是11:42:16,因此将返回值
“16”
。您需要的是自epoch以来的总秒数,您可以使用
date()
函数获得该值,但使用返回整数的
time()
将更容易获得该值


同样在JS代码中,您正在使用
var
重新定义变量-不要这样做。:)

JavaScript

var interval = setInterval(function(){ 
    $.getJSON('api.php', function(data) {
        if (getCookie('old_modification') != data.filedate) {
            window.location.reload();
        };

        setCookie('old_modification', data.filedate);
    });
}, 1000);

function setCookie(name, value) {
    var cookie_string = name + "=" + encodeURI(value);
    document.cookie = cookie_string;
}

function getCookie(cookie_name) {
    var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]*)(;|$)');
    return results ? unescape(results[2]) : null;
}

if(getCookie('old_modification') === null) {
    setCookie('old_modification', 0);
}
PHP

$filename = "test.php";

if (file_exists($filename)) {
    echo json_encode(array(
        'filedate' => filemtime($filename)
    )); 
}
由于每次都要重新加载页面,
oldVar
值始终设置为
0
,当您在计时器中使用从AJAX接收的数据检查其值时,该值不会生效

在这里,您需要一些存储来保存和更新旧值。我更喜欢用cookie来达到这个目的。除了另一个选项,我没有其他选择,那就是更新页面的特定部分,而不是重新加载页面本身

我使用参考来使用JavaScript获取和设置cookies,因为它比我的简单,并且根据您的要求对其进行了一些更改

回到PHP部分,我不知道为什么在
date
函数中使用
s
格式。它只从文件的修改时间中获取秒数,这是不可靠的,因为秒数在某个点上可能是相同的。例如,您在11:30:50修改一个文件,然后在11:31:50再次修改一个文件,这样在重新加载页面时不会生效。而且,我知道这是一种非常罕见的情况。尽管如此,还是要单独使用
filemtime
,因为它会返回unix时间戳,并且在任何时候都不会相同


希望有帮助

我建议您使用php而不是客户端进行计算和处理重定向。您的问题是oldVar始终为0,而不是oldVar的新值吗?@hokusai感谢您的回复,不,这不是问题所在,我只希望javascript在修改页面时刷新页面。刷新时,api.php返回一个json值,每当我对test.php进行更改时,该值都会更改。我希望javascript每秒检查一次这个页面。当它看到一个变化时,我希望它触发一个刷新。关于time()和date()部分,在这种情况下它真的不重要。它按预期工作。我以精确的秒数保存文件的可能性非常小。不过PHP部分不是问题所在。我也不知道我是怎么把事情搞砸的,但是我改正了错误。我从你的awnser那里学到了很多!非常感谢你!