2014-04-18 7 views
1

Google 어스에 kml 파일을 동적으로 추가하고 있습니다. 이를 위해 kml을 추가하고 kml을 제거하는 자바 스크립트 함수를 작성했습니다. 이 함수는 처음에는 kml에 대해 잘 작동합니다. 그러나 다시 부름을 받으면 그들은 반응하지 않습니다. 이것은 추가하거나 제거하려고하는 각 kml에 대해 발생합니다. 브라우저에서 페이지를 잠시 동안 유지하면 이러한 기능이 다시 한 번 응답하고 다시 응답하지 않게됩니다.Google 어스 플러그인이 appendchild 및 removechild에 응답하지 않습니다.

function add(id, fileurl) 
      { 
       var link = ge.createLink(''); 
       var href= fileurl; 
       link.setHref(href); 
       var networkLink = ge.createNetworkLink("'" + id + "'"); 
       networkLink.set(link, true, true); 
       ge.getFeatures().appendChild(networkLink); 
      } 

      function remove(id) 
      { 
       for(var i=0; i<ge.getFeatures().getChildNodes().getLength(); i++) 
       { 
        if(ge.getFeatures().getChildNodes().item(i).getId() == id || ge.getFeatures().getChildNodes().item(i).getId() == "'" + id + "'") 
        { 
         id = ge.getFeatures().getChildNodes().item(i).getId(); 
         ge.getFeatures().removeChild(ge.getElementById(id)); 
         break; 
        } 
       } 

답변

0

문제는 이미 모든 참조가 해제 될 때까지 이미 사용한 ID를 사용하여 기능을 다시 추가 할 수 없다는 것입니다. 이것은 일반적으로 내부 가비지 컬렉터에 의해 수행되지만 삭제하려는 객체에서 release()을 호출하여 강제로 수행 할 수도 있습니다. 이 ...

개체를 영구적으로 삭제하여 ID를 다시 사용할 수 있도록합니다. 해제 된 객체에 액세스하려고 시도하면 오류가 발생합니다.

또한 API로 개체를 만들 때 개체에는 기본 주소가 없습니다. 이 경우 getElementById()에 ID 만 전달하여 객체를 반환 할 수 있습니다. 그런 다음이 기능을 제거하는 데 사용할 수 있습니다.

function remove(id) { 
    ge.getElementById(id).release(); 
} 

정말 내가 전부 ID를 사용하지 않는 것이 보일 것이다 단순히 기능을 가리키는 변수를 유지하는 것이지만, 다음 제거하는 것을 사용한다. 예 :

function add(fileurl) { 
    var link = ge.createLink(''); //no id 
    link.setHref(fileurl); 
    var networkLink = ge.createNetworkLink(''); //no id 
    networkLink.set(link, true, true); 
    ge.getFeatures().appendChild(networkLink); 
    return networkLink; 
} 

var link1 = add("http://yoursite.com/file.kml"); 
var link2 = add("http://yoursite.com/file2.kml"); // etc... 

// then to remove, simply... 

link1.release(); 
link2.release(); 
+0

답장을 보내 주신 Fraser에게 감사드립니다. 이론적으로 인정합니다. –

0

확인. 그래서 GE에서 객체를 제거한 다음 동일한 ID를 가진 다른 객체를 추가하려고하면 GE는 불만을 토로하고 객체를 만들지 않는다는 것을 알아 냈습니다. - 약간의 시간 (제 경우에는 약 30 초)이 경과하지 않는 한. 이번에는 실제로 객체를 가비지 수집하는 데 JavaScript가 필요합니다. 오브젝트를 널 (NULL)로 설정해도 즉시 결과는 나오지 않지만 가비지 콜렉터가 도움이 될 수 있습니다. GE가 제공하는 release() 메소드도 도움이되지 않습니다.