2017-01-02 183 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