2012-08-26 85 views
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 
    }; 
} 
}); 

非常感謝您的幫助:)

回答

1

您得到恰好的問題是什麼告訴你的錯誤。

Object #<MouseEvent> has no method 'getCurrentTarget' 

問題在於錨的onclick事件處理程序中的變量event引薦鏈接,而不是在地標上點擊的點擊。那是event是一個DOM鼠標事件而不是KmlMouseEvent。

另外,您需要調用以引用KMLEvent最初分派的對象的方法是getTarget

請參閱API指南KmlEvent.getTarget: https://developers.google.com/earth/documentation/reference/interface_kml_event#adfee4d0797ff7d437e77c649673f9ffc

要解決這個問題,你需要做一些事情,首先定義一個全局變量來保存任何當前的地標單擊事件。在定義ge變量的腳本頂部執行此操作,也可以添加currentEvent變量。即

var ge = null; 
var currentEvent = null; 

其次你mousedown聽衆應該ammended允許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 
     }; 
    } 
}); 

我已經完全測試這一點,它的工作原理AOK,當你點擊delete地標被刪除,目前的氣球被關閉。

+0

感謝您的回覆@Fraser。我也嘗試過,不幸的是它也不起作用:'Uncaught TypeError:Object#'getTarget''沒有方法。這表明在事件中,事件指的是錯誤的事情。如果不花費很長時間通過Google進行研究,閱讀文檔或者只是嘗試(我花了幾個小時完成所有三個),我不會問問題,但很遺憾,我無法解決這個問題。謝謝。 – chow

+0

啊,是的'事件'是指錨點上的DOM事件,而不是地標上的KML鼠標事件。請參閱我編輯的答案...'getTarget' vs'getCurrentTarget'仍然適用,因爲我首先聲明... – Fraser

+1

非常棒,非常感謝。這工作完美。看起來我需要更深入地瞭解基礎知識(DOM等),然後才能深入JavaScript ......自從學習HTML之後,至少要15年......非常感謝。今天收購了JavaScript權威指南的副本,並將繼續推廣。謝謝。 – chow