From 0e05f90932e9e5aa29ffb8b966dc9f6e926595e1 Mon Sep 17 00:00:00 2001 From: crschmidt Date: Tue, 7 Apr 2009 15:21:39 +0000 Subject: [PATCH] Remove Icon-specific code from Markers Layer, patch by meek,me, r=euzuro. (Closes #818) git-svn-id: http://svn.openlayers.org/trunk/openlayers@9233 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Icon.js | 13 +++++++++++++ lib/OpenLayers/Layer/Markers.js | 5 +---- lib/OpenLayers/Marker.js | 13 +++++++++++++ tests/Layer/Markers.html | 10 +++++++++- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/OpenLayers/Icon.js b/lib/OpenLayers/Icon.js index 0cea2833f9..5dd8537bef 100644 --- a/lib/OpenLayers/Icon.js +++ b/lib/OpenLayers/Icon.js @@ -78,6 +78,9 @@ OpenLayers.Icon = OpenLayers.Class({ * references and memory leaks */ destroy: function() { + // erase any drawn elements + this.erase(); + OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild); this.imageDiv.innerHTML = ""; this.imageDiv = null; @@ -143,6 +146,16 @@ OpenLayers.Icon = OpenLayers.Class({ return this.imageDiv; }, + /** + * Method: erase + * Erase the underlying image element. + * + */ + erase: function() { + if (this.imageDiv != null && this.imageDiv.parentNode != null) { + OpenLayers.Element.remove(this.imageDiv); + } + }, /** * Method: setOpacity diff --git a/lib/OpenLayers/Layer/Markers.js b/lib/OpenLayers/Layer/Markers.js index a37f2c0cd1..3298738e09 100644 --- a/lib/OpenLayers/Layer/Markers.js +++ b/lib/OpenLayers/Layer/Markers.js @@ -122,10 +122,7 @@ OpenLayers.Layer.Markers = OpenLayers.Class(OpenLayers.Layer, { removeMarker: function(marker) { if (this.markers && this.markers.length) { OpenLayers.Util.removeItem(this.markers, marker); - if ((marker.icon != null) && (marker.icon.imageDiv != null) && - (marker.icon.imageDiv.parentNode == this.div) ) { - this.div.removeChild(marker.icon.imageDiv); - } + marker.erase(); } }, diff --git a/lib/OpenLayers/Marker.js b/lib/OpenLayers/Marker.js index 979003f606..3e0845eb5e 100644 --- a/lib/OpenLayers/Marker.js +++ b/lib/OpenLayers/Marker.js @@ -89,6 +89,9 @@ OpenLayers.Marker = OpenLayers.Class({ * know which layer it is attached to.) */ destroy: function() { + // erase any drawn features + this.erase(); + this.map = null; this.events.destroy(); @@ -115,6 +118,16 @@ OpenLayers.Marker = OpenLayers.Class({ return this.icon.draw(px); }, + /** + * Method: erase + * Erases any drawn elements for this marker. + */ + erase: function() { + if (this.icon != null) { + this.icon.erase(); + } + }, + /** * Method: moveTo * Move the marker to the new location. diff --git a/tests/Layer/Markers.html b/tests/Layer/Markers.html index f573176f18..6e994f5752 100644 --- a/tests/Layer/Markers.html +++ b/tests/Layer/Markers.html @@ -23,7 +23,7 @@ t.eq( layer.markers.length, 1, "addLayer adds marker to layer." ); } function test_addMarker_removeMarker (t) { - t.plan( 4 ); + t.plan( 6 ); var map = new OpenLayers.Map('map'); var baseLayer = new OpenLayers.Layer.WMS("Test Layer", @@ -38,6 +38,8 @@ t.ok( marker.icon.imageDiv.parentNode == layer.div, "addMarker adds marker image node into layer node." ); layer.removeMarker(marker); t.ok( marker.icon.imageDiv.parentNode != layer.div, "removeMarker removes marker image node from layer node." ); + layer.removeMarker(marker); + t.ok(true, "Removing marker twice does not fail."); layer.addMarker(marker); t.ok( marker.icon.imageDiv.parentNode == layer.div, "addMarker adds marker image node into layer node." ); @@ -45,6 +47,12 @@ layer.removeMarker(marker); t.ok(true, "removing marker when no markers present does not script error"); + var l = new OpenLayers.Layer.Markers(); + var marker = new OpenLayers.Marker(new OpenLayers.LonLat(5,40)); + l.addMarker(marker); + l.removeMarker(marker); + t.ok(true, "Removing marker when layer not added to map does not fail."); + } function test_markerMovement(t) {