2017-01-02 2 views
1

서버의 페이지 파일을 수정하면 javascript가 페이지를 새로 고치기를 원합니다.파일을 새로 고침 할 때 페이지 새로 고침

나는 api.php (아래 참조)를 사용하여 파일의 파일 수정 시간을 가져 와서 json으로 반환합니다.

그래서 api.php에서 데이터를 가져 오는 것은 아무런 문제가되지 않지만 이전 값을 자바 스크립트의 새 값과 어떻게 비교하고 페이지가 새로 고쳐 지는지 어떻게 알 수 있습니까? 여기

내가 지금까지 무엇을했는지 있습니다 :

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을 사용하여 서버의 파일 수정 시간을 확인합니다. 당신은 단지 시간의 초 부분을 반환 date("s", ...) 사용하고

<?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이 allways 0이고 oldVar에 대한 새 값이 아닌 문제가 있습니까? – Hokusai

+0

@hokusai 답장을 보내 주셔서 감사합니다. 문제가되지 않습니다. 원하는 것은 페이지에 수정이 가해 졌을 때 페이지를 새로 고치는 자바 스크립트입니다. 새로 고침 api.php는 test.php를 변경할 때마다 변경되는 json 값을 반환합니다. 자바 스크립트가 매초이 페이지를 확인하고 싶습니다. 변경 사항이 표시되면 새로 고침을 트리거하려고합니다. – Niels

답변

1

자바 스크립트

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는 페이지마다 다시로드하고 있기 때문에, oldVar 값은 항상 0로 설정하고

$filename = "test.php"; 

if (file_exists($filename)) { 
    echo json_encode(array(
     'filedate' => filemtime($filename) 
    )); 
} 

은 고려하지 않습니다 타이머의 AJAX에서받은 데이터로 값을 확인할 때 효과적입니다.

여기에서 이전 값을 유지하고 업데이트하려면 일부 저장소가 필요합니다. 나는 그 목적을 위해 쿠키를 사용하는 것을 선호했다. 페이지 자체를 다시로드하는 대신 페이지의 특정 부분을 업데이트하는 다른 옵션을 제외한 다른 옵션은 없습니다.

JavaScript를 사용하여 쿠키를 가져오고 설정하려면 this 참조를 사용했습니다. 이는 간단하고 쉽기 때문에 요구 사항에 따라 일부 변경되었습니다.

PHP 부분으로 돌아와서 date 기능에 s 형식을 사용하는 이유가 확실하지 않습니다. 몇 초에서 몇 초가 같을 수 있기 때문에 신뢰할 수없는 파일의 수정 시간에서 초를 얻을 수 있습니다. 예를 들어 11시 30 분 50 초에 파일을 수정하고 11시 31 분 50 초에 파일을 다시 수정하면 페이지를 다시로드 할 때 적용되지 않습니다. 또한 매우 드문 시나리오입니다. 유닉스 타임 스탬프를 반환하기 때문에 언제든지 동일하지 않을 것이므로 filemtime만을 사용하십시오.

희망이 있습니다.

+0

나는 당신의 신자에게서 많은 것을 배웠다! 고마워요! – Niels

+1

그 형제에 대해 기뻐합니다! 천만에요! :) – Perumal

0

- 그 값 "16"을 반환 있도록 즉, 지금은, 내 시간대에 11시 42분 16초입니다. 원하는 것은 신기원 이후의 총 시간이며, date() 함수로 얻을 수 있지만 정수를 반환하는 time()을 사용하면 더 쉬울 것입니다.

또한 JS 코드에서 변수를 var으로 다시 정의하고 있습니다. 그렇게하지 마십시오. :)

+0

시간() 및 날짜() 부분에 대해서는 실제로이 경우 중요하지 않습니다. 의도 한대로 작동합니다. 정확한 초에 파일을 저장하는 가능성은 매우 희박합니다. PHP 부분은 문제가되지 않습니다. 또한 어떻게 그걸 망쳐 놓았는지 모르지만 실수를 바로 잡았습니다. – Niels