2015-01-07 4 views
0

나는 다음과 같은 XML 파일 (인 data.xml)이 있습니다Jquery를 사용하여 XML 파일 읽기, 이것을 서버 보낸 이벤트와 결합하여 페이지를 최신 상태로 유지하는 방법?

<?xml version="1.0" encoding="UTF-8"?> 
<users> 
    <user> 
     <id>2011</id> 
     <posX>12</posX> 
     <posY>29</posY> 
     <title>Senior Developer</title> 
    </user> 
    <user> 
     <id>2022</id> 
     <posX>99</posX> 
     <posY>99</posY> 
     <title>updated!</title> 
    </user> 
</users> 

내가 jQuery를 사용하여이 파일을 읽어

$.ajax({ 
        url: 'js/data.xml', // name of file you want to parse 
        dataType: "xml", 
        success: parse, 
        error: function(){alert("Error: Something went wrong");} 
        }); 

및 사용하여 표시를;

function parse(document){ 
        $(document).find("user").each(function(){ 
        $("#test").append( // this is where all the reading and writing will happen 
        '<div style="position: absolute; top: '+$(this).find('posY').text()+'px; left: '+$(this).find('posX').text()+'px; width: 100px; height: 100px;">ID: '+$(this).find('id').text()+ // which represents user->id 
        '<br /> X: '+$(this).find('posX').text()+ 
        '<br /> Y: '+$(this).find('posY').text()+ 
        '<br /> Title: '+$(this).find('title').text()+ 
        '</div>' 
        ); 
        }); 
       } 

이 모두 정상적으로 작동합니다. XML이 읽 t지고 데이터가 표시됩니다. 이제는 페이지를로드 할 때만 발생하므로 한 번만 수행하십시오.

사용자가 xml을 업데이트 할 수 있지만 (제목이 변경되었다고 가정) 페이지를 새로 고침하면 이러한 변경 사항 만 표시됩니다. 나는 xquery를 x 초마다 jquery를 사용하여로드 할 수 있다는 것을 알고 있지만 변경 사항이있을 때 xml 파일을 전송할 수있는 서버 보내기 이벤트도 읽었습니다.

나는 이것을하고 싶다. 문제는 다음과 같습니다.이를 달성하기 위해 SSE를 구현하려면 어떻게해야합니까?

나는 몇 가지 조사를하고 몇 가지 데모 코드 발견 :

var source = new EventSource("js/data.xml"); 
source.onmessage = function(event) { 
    document.getElementById("test").innerHTML += event.data + "<br>"; 
}; 

을하지만이 작동하지 않았다.

그래서 내가 원하는 :

  1. 로드 페이지 + 부하 XML XML이 어쨌든에서 변경되는 경우
  2. (SSE를 사용) 페이지에 XML을 밀어 (이 현재 수행되는 것입니다)
  3. 표시 데이터 (POSX가 변경되는 경우, 그래서 사업부는 aswell 이동해야합니다)

내 현재 작업 HTML 코드를 뺀 SSE :

,536,913,632 10
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <style> 
     #test { position: relative; width: 500px; height: 500px; padding: 0.5em; border: 1px solid red;} 
     </style> 
    </head> 
    <body> 
     <div id="test"></div> 

     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js "></script> 
     <script type="text/javascript"> 
      $(document).ready(function(){ 

       function parse(document){ 
        $(document).find("user").each(function(){ 
        $("#test").append( // this is where all the reading and writing will happen 
        '<div style="position: absolute; top: '+$(this).find('posY').text()+'px; left: '+$(this).find('posX').text()+'px; width: 100px; height: 100px;">ID: '+$(this).find('id').text()+ // which represents user->id 
        '<br /> X: '+$(this).find('posX').text()+ 
        '<br /> Y: '+$(this).find('posY').text()+ 
        '<br /> Title: '+$(this).find('title').text()+ 
        '</div>' 
        ); 
        }); 
       } 

        $.ajax({ 
        url: 'js/data.xml', // name of file you want to parse 
        dataType: "xml", 
        success: parse, 
        error: function(){alert("Error: Something went wrong");} 
        }); 
      }); 
     </script> 
    </body> 
</html> 

희망 누군가가 내 댓글에서

+0

정적 파일로는이 작업을 수행 할 수 없다고 말할 수 있습니다. 서버는 이벤트를 트리거하기 위해 클라이언트에 특정 데이터를 보내야합니다. https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events 내 최선의 조언은 시간 초과를 설정하고'HEAD' 요청을 수행하고 마지막 수정 된 날짜를 확인하는 것입니다 날짜가 XML 파일에 변경 사항이 있습니다. –

답변

0

나를 도울 수 : 지금까지

을 당신이 정적 파일을 사용하여이 작업을 수행 할 수 말할 수 있습니다. 서버 은 이벤트를 트리거하기 위해 클라이언트에 특정 데이터를 보내야합니다. developer.mozilla.org/en-US/docs/Server-sent_events/... 내 최고의 조언 은 시간 제한을 설정하고 HEAD 요청을 수행하고 으로 확인하여 마지막 수정 날짜가 변경되었는지 확인하십시오. XML 파일.

비슷한 질문 : XML 파일이 마지막 요청 이후 업데이트 된 경우에만 성공을 호출합니다

$.ajax() call, only on updation

$.ajax({ 
    type: "GET", 
    ifModified: true, 
    url: 'js/data.xml', 
    dataType: "xml", 
    success: parse 
}); 

.

+0

Uhm Bummer, jquery를 실행하여 파일을 다시 읽는 것보다 SSE를 사용할 수 있습니까? 귀하의 제안은 (좋은) SSE 아이디어를 제거합니다. – Maurice

+0

그래, SSE를 사용하여 서버의 파일을 모니터하고 클라이언트가 업데이트되었을 때 클라이언트에게 알릴 수 있는지 확인하십시오. 하지만 몇 가지 사항을 고려해야합니다 - 주로 복잡성, 브라우저 지원. IE는 SSE를 전혀 지원하지 않지만 IE가 문제가되지 않는다면 괜찮습니다. 복잡성에 관해서는 서버가 클라이언트에게 변경 사항이 있음을 알리고 클라이언트가 변경을 요청할 것이므로 이는 오버 헤드가 많습니다. 가장 좋은 방법은 변경된 서버가 업데이트 된 데이터를 보내고 클라이언트 측에서 아약스하지 않는 것입니다. –

+0

IE는 문제가되지 않으며 결국 지원할 것입니다. "최선의 방법은 클라이언트 측에서 변경된 아약스가 아닌 서버가 업데이트 된 데이터를 보내도록하는 것입니다." 이 작업을 수행? 어떤 아이디어? – Maurice

0

이 작업을 수행 할 수 있습니다. 방법은 다음과 같습니다. 1.while 루프가있는 PHP 페이지 while (1) {// 연속 루프 DB 또는 XML 파일을 확인하고 마지막 체크가 이후로 변경되었는지 확인하려면 여기를 논리하십시오. 출력 XML이 변경된 경우. 이 함수를 사용하여 fr_EncodeXML ~ 모든 줄 바꿈과 문제가있는 초과 공백을 제거하십시오.

function fr_EncodeXML($sData){ 
     $sData = preg_replace('/[\r\n]+/', '', $sData); // Remove line breaks etc 
     $sData = preg_replace('/[ \t]+/', ' ', $sData); // Remove excess spaces etc 
     $sData = htmlentities($sData); // Make valid UTF-8. 
     return $sData; 
    } 


$xml_string = fr_EncodeXML($xml_string); 
     echo "data:" . $xml_string . "\n\n"; 

     ob_end_flush(); 
     flush(); 
     sleep(100); //Time determines refresh rate 

} 

2. J 스크립트 페이지. J 스크립트는 eventsrc.onmessage = function (이벤트) {..event.data 오브젝트 의 데이터를 수신합니다. XML 텍스트의 '<'& '>'이 (가) 이스케이프됩니다. 이 JS 함수를 사용하여 DOM으로 파싱 할 수있는 XML로 복원합니다.

function fr_htmlDecode(sXML) { 
    var a = document.createElement('a'); a.innerHTML = sXML; 
    return a.textContent; 
}; 

희망이 도움이됩니다.