2017-01-02 146 views
1

我希望javascript在对服务器上的页面文件进行修改时刷新页面。文件更改后的刷新页面

我使用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);  
    } 

?> 
+0

我会建议做的计算和处理重定向在PHP而不是客户端 – RamRaider

+0

是你的问题,oldVar总是0,而不是你的新值oldVar? – Hokusai

+0

@hokusai感谢您的回复,不,这不是问题,我想要的只是在页面修改完成后刷新页面。 刷新后api.php返回一个json值,只要我做一个改变test.php就会改变。我想javascript每秒钟检查一次这个页面。当它看到一个更改时,我希望它触发刷新。 – Niels

回答

1

的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来达到这个目的。除了另一个更新页面的某个部分而不是重新加载页面本身之外,我没有别的选择。

我已经使用this引用来使用JavaScript获取和设置cookie,因为它比我的简单和容易,并根据您的要求做了一些更改。

回到PHP部分,我不确定为什么在date函数中使用s格式。它只会从文件的修改时间中获得几秒钟的时间,因为某些时刻秒数可能相同。例如,您在11:30:50修改文件并在11:31:50再次修改文件,并且在重新加载页面时不会生效。另外,我知道这是非常罕见的情况。尽管如此,单独坚持使用filemtime,因为它返回unix时间戳,并且不会随时更新。

希望它有帮助!

+0

我从你的玩具中学到了很多东西!非常感谢你! – Niels

+1

我很高兴那个兄弟!别客气! :) – Perumal

0

您使用date("s", ...)刚刚返回的时间的秒数部分 - 即现在它是我的时区11时42分16秒,这样就会返回值"16"。你想要的是自纪元以来的总秒数,你可以用date()函数得到它,但使用time()会更容易,它会返回一个整数。

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

+0

关于时间()和日期()部分,在这种情况下确实没有关系。它按预期工作。我精确地保存文件的机会非常渺茫。 PHP部分不是问题。 另外我不知道我是如何设法解决这个问题,但纠正了错误。 – Niels