谷歌地球插件不响应appendchild和removechild

时间:2014-04-18 12:01:01

标签: google-earth-plugin removechild appendchild

我正在动态地将kml文件添加到Google地球。为此,我编写了javascript函数来添加kml并删除kml。这些功能在kml时首次正常工作。但如果再次打电话,他们就不会回应。对于我尝试添加或删除的每个kml都会发生这种情况。如果我将页面保留在浏览器上一段时间,那么这些功能会再次响应一次又一次无响应。

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;
                    }
                }

2 个答案:

答案 0 :(得分:0)

问题是,在释放所有对它的引用之前,您无法使用已使用的ID重新添加功能。这通常由内部垃圾收集器完成 - 但您也可以通过在要删除的对象上调用release()来强制它。这......

  

永久删除对象,允许重复使用其ID。   一旦释放对象,尝试访问该对象将导致该对象   错误。

此外,当使用API​​创建对象时,对象没有基址。在这种情况下,可以通过仅将其ID传递给getElementById()来返回对象。然后可以使用它来删除该功能。

e.g。

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

实际上,我希望完全避免使用ID,只是保留一个指向该功能的变量,然后使用它来删除。 e.g。

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();

答案 1 :(得分:0)

行。所以我想出如果你从GE中移除一个对象,然后尝试添加另一个具有相同id的对象,GE抱怨并且不会创建该对象 - 除非有一些时间(在我的情况下大约30秒)通过。这次实际上是JavaScript要求垃圾收集对象。 将对象设置为null并不能立即得到结果,但可能有助于垃圾收集器。 GE提供的release()方法也无济于事。