【问题标题】:google earth plugin does not respond to appendchild and removechild谷歌地球插件不响应 appendchild 和 removechild
【发布时间】:2014-04-18 12:01:00
【问题描述】:

我正在向谷歌地球动态添加 kml 文件。为此,我编写了 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;
                    }
                }

【问题讨论】:

    标签: google-earth-plugin removechild appendchild


    【解决方案1】:

    问题在于,在所有对它的引用都已发布之前,您无法使用已使用的 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();
    

    【讨论】:

    • 感谢弗雷泽的回答,理论上我接受了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多