我正在动态地将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;
}
}
答案 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()方法也无济于事。