2014-04-18 36 views
1

我动态地将kml文件添加到谷歌地球。为此,我编写了javascript函数来添加kml并删除kml。这些功能第一次在1公里内正常工作。但如果再次被调用,他们不会回应。这发生在我尝试添加或删除的每kml中。如果我将浏览器页面保留一段时间,那么这些功能会再次响应一次又一次无响应。谷歌地球插件不响应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​​创建对象时,对象没有基地址。在这种情况下,可以通过仅将其ID传递给getElementById()来返回该对象。这可以用来删除该功能。

例如

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

感谢弗雷泽的回答,我理论上接受它。 –

0

好的。所以我想,如果你从GE中删除一个对象,然后尝试添加另一个具有相同ID的对象,GE抱怨并且不会创建该对象 - 除非有一段时间(在我的情况下约为30秒)已经过去。 JavaScript实际上需要垃圾收集对象。 将对象设置为null不会产生即时结果,但可能有助于垃圾收集器。由GE提供的释放()方法也无济于事。