[Gelöst] Alle Marker eines layers durchiterieren

Hallo OSM Community,

mit folgendem Snippet habe ich ein Problem:


	$.each(layer_no_markers.markers, function(i, no_marker) { 
		 alert(no_marker[i]);
		 if(!bounds.containsLonLat(no_marker[i])) {
			 layer_no_markers.removeMarker(no_marker[i]);
			 no_marker[i].destroy();
		 }
	});

Der gewünschte Effekt ist, dass Marker die nicht im Sichtbereich liegen wieder gelöscht werden. Die Alertbox taucht ganz oft auf, allerdings immer mit dem Inhalt undefined. Kann aber doch eigentlich nicht sein? Wenn die foreach schleife objekte durchgeht muss ich die doch auch so anwählen können?

Nahmd,

Lass Dir mal alle Objecte anzeigen:


alert("i=" + i + ", no_marker=" + no_marker + ", no_marker[i]=" + no_marker[i]);

Gruß Wolf

Dann bekomme ich:
i=0, no_marker=[object Object], no_marker[ i]=undefined

Also brauche ich den Index gar nicht um auf die Objekte zuzugreifen :open_mouth:

Allerdings bekomme ich dann immer irgendwan:


Uncaught TypeError: Cannot read property 'lon' of undefined
OpenLayers.Bounds.OpenLayers.Class.containsLonLatOpenLayers.js:175
(anonymous function)map.js:162
jQuery.extend.eachjquery.js:658
clearOldNodesmap.js:159
addWheelmapNodesmap.js:152
OpenLayers.Events.OpenLayers.Class.triggerEventOpenLayers.js:400
OpenLayers.Map.OpenLayers.Class.panOpenLayers.js:471
OpenLayers.Control.DragPan.OpenLayers.Class.panMapDoneOpenLayers.js:2195
OpenLayers.Handler.OpenLayers.Class.callbackOpenLayers.js:1351
OpenLayers.Handler.Drag.OpenLayers.Class.dragendOpenLayers.js:1358
OpenLayers.Handler.Drag.OpenLayers.Class.mouseupOpenLayers.js:1361
OpenLayers.Events.OpenLayers.Class.triggerEventOpenLayers.js:400
OpenLayers.Events.OpenLayers.Class.handleBrowserEventOpenLayers.js:406
(anonymous function)

Umgangen bin ich das ganze nun erstmal so:


var bounds = map.calculateBounds(map.getCenter(),map.getResolution());
	bounds.transform(map.getProjectionObject(), map.displayProjection);
	
	$.each(layer_no_markers.markers, function(i, no_marker) { 
		if(no_marker != undefined) {
			if(!bounds.containsLonLat(no_marker)) {
				layer_no_markers.removeMarker(no_marker);
				no_marker.destroy();
			}
		}
	});

Hat vielleicht jemand eine Idee warum diese Liste ein undefined object enthält?

Nahmd,

Fein :slight_smile:

Durch das


layer_no_markers.removeMarker(no_marker);

wird das Element “markers” des Layer-Objektes um 1 Element geschrumpft.

Wenn das $.each so implementiert ist, dass die Anzahl der Objekte zu Beginn der Schleife bestimmt und dann der gespeicherte Wert benutzt wird, wird es zu Ende der Schleife auf ein Feld hinter dem Ende des Arrays zugreifen. Es gibt übrigens ein zweites Problem: wenn der die Felder 0,1,2,…,i,…len-1 bearbeitet, und Du bei der Bearbeitung von i das Element i löschst, rückt das Element i+1 auf den Platz i, i+2 auf den Platz i+1 usw. Das heißt aber, dass das Element i+1 nicht bearbeitet wird.

Ich schlage vor, dass Du die zu löschenden Elemente zuerst in einem Array zwischenspeicherst:


var moribundi=[];	
$.each(layer_no_markers.markers, function(i, no_marker) {
	if(!bounds.containsLonLat(no_marker)) moribundi.push(no_marker);
}
for (i in moribundi) {
	var no_marker=moribundi[i];
	layer_no_markers.removeMarker(no_marker);
	no_marker.destroy();
}

Gruß Wolf

Klar, das macht Sinn! Vielen Dank für deine Hilfe da hätte ich glaub ich noch lange gegrübelt bis der Groschen gefallen wäre :slight_smile: