1

我正在为我正在编写的应用程序尝试使用 Google 地球插件 API。我希望能够从地图中删除地标。我能想到的最简单的方法是创建一个带有“删除”链接的气球弹出窗口,但我一直无法弄清楚如何删除:

balloon.setContentString(
'Location: ' + event.getLatitude().toString() + ", " +
event.getLongitude().toString() + '<br />&nbsp;<br />' +
'<a href="#" onclick="ge.getFeatures().removeChild(event.getCurrentTarget())">Delete</a><br /><a href="#" onclick="prompt(\'Enter new name\', \'blah\'\)">Rename</a>');

这导致:

Uncaught TypeError: Object #<MouseEvent> has no method 'getCurrentTarget' earth2.html:1 onclick

(如您所见,我也希望能够重命名,但大概在我想出删除时不会那么难弄清楚?)

整个代码可以在以下位置找到:

http://chrishowells.co.uk:81/earth2.html

整个区块:

google.earth.addEventListener(ge.getWindow(), 'mousedown', function(event) {
if (event.getTarget().getType() == 'KmlPlacemark' &&
    event.getTarget().getGeometry().getType() == 'KmlPoint') {
  // don't show the default popup
  //http://code.google.com/apis/ajax/playground/?exp=earth#javascript_in_balloons
  event.preventDefault();

var balloon = ge.createHtmlStringBalloon('');
balloon.setFeature(event.getTarget());
//balloon.setMaxWidth(300);

balloon.setContentString(
  'Location: ' + event.getLatitude().toString() + ", " +
event.getLongitude().toString() + '<br />&nbsp;<br />' +
'<a href="#" onclick="ge.getFeatures().removeChild(event.getCurrentTarget())">Delete</a><br /><a href="#" onclick="prompt(\'Enter new name\', \'blah\'\)">Rename</a>');
ge.setBalloon(balloon);

var placemark = event.getTarget();

dragInfo = {
    placemark: event.getTarget(),
    dragged: false
  };
}
});
4

1 回答 1

1

你得到的错误是告诉你到底是什么问题。

 Object #<MouseEvent> has no method 'getCurrentTarget'

问题在于,在onclick锚点的事件处理程序中,event变量引用的是点击链接而不是点击地标。那是event一个 DOM 鼠标事件而不是 KmlMouseEvent。

此外,您需要调用以引用最初分派 KMLEvent 的对象的方法是getTarget.

请参阅 KmlEvent.getTarget 的 API 指南: https ://developers.google.com/earth/documentation/reference/interface_kml_event#adfee4d0797ff7d437e77c649673f9ffc

要解决这个问题,您需要做很多事情,首先定义一个全局变量来保存任何当前的地标点击事件。在定义变量的脚本顶部执行此操作,同时ge添加一个currentEvent变量。IE

var ge = null; 
var currentEvent = null;

其次,您的mousedown侦听器应该被修改以允许气球中的 javascript 引用currentEvent您定义的变量。

最后,您应该使用该currentEvent变量来引用地标,以通过气球中的代码将其删除。

例如。

google.earth.addEventListener(ge.getWindow(), 'mousedown', function(event) {

    if (event.getTarget().getType() == 'KmlPlacemark' &&
    event.getTarget().getGeometry().getType() == 'KmlPoint') {
        currentEvent = event; // used in the balloon content string
        event.preventDefault();

        var balloon = ge.createHtmlStringBalloon('');
        balloon.setFeature(event.getTarget());

        balloon.setContentString(
        'Location: ' + event.getLatitude().toString() + ", " +
        event.getLongitude().toString() + '<br />&nbsp;<br />' +
        '<a href="#" onclick="ge.getFeatures().removeChild(currentEvent.getTarget());ge.setBalloon(null);">Delete</a><br /><a href="#" onclick="prompt(\'Enter new name\', \'blah\'\)">Rename</a>');
        ge.setBalloon(balloon);

        dragInfo = {
            placemark: event.getTarget(),
            dragged: false
        };
    }
});

我已经对此进行了全面测试,并且当您单击delete地标被删除并且当前气球关闭时,它可以正常工作。

于 2012-08-27T12:38:13.320 回答