我希望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 :(得分: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部分,我不确定为什么在s
函数中使用date
格式。它只能从文件的修改时间开始几秒钟,这是不可靠的,因为在某些时候秒可能是相同的。例如,您在11:30:50修改文件并再次在11:31:50修改文件,它将在重新加载页面时生效。此外,我知道这是一种非常罕见的情况。尽管如此,坚持使用filemtime
,因为它会返回unix时间戳,并且不会随时变得相同。
希望它有所帮助!
答案 1 :(得分:0)
您正在使用date("s", ...)
,它只返回时间的秒部分 - 即现在我的时区是11:42:16,因此会返回值"16"
。您想要的是自纪元以来的总秒数,您可以使用date()
函数获得,但使用time()
返回整数会更容易。
同样在您的JS代码中,您使用var
重新定义变量 - 不要这样做。 :)