Popups automatisch schließen bei neuem Popup

Hallo,
ich stehe ein bisschen auf dem Schlauch.
Habe auf der Arbeit ein OSM-Projekt vorgesetzt bekommen, das sich im Aufbau befindet.
Das Problem ist, dass die Popups sich zwar öffnen.
Aber wenn sich ein neuer Popup öffnet, dann bleiben die alten ebenfalls geöffnet.
Allerdings sollen offene Popups geschlossen werden.

Das ist mein Problem. Ich habe mich schon ein bisschen eingelesen, aber ich fürchte, ohne Hilfe komme ich nicht weiter.
Wenn ich es richtig gesehen habe, dann kommt der mir vorgesetzte Code großenteils auch aus Anleitungen und Tutorials. Ich bin also guter Hoffnung, dass irgendwer den Code kennt.

Aus dieser Anleitung: http://wiki.openstreetmap.org/wiki/Die_JavaScript_Dateien wurde das tom.js eingebunden.

Im HTML-Template wird dann im Javascript ein Array mit den Standort-Infos eingebunden (Code ist vereinfacht, da die genauen Koordinaten und Daten nichts zur Sache tun):


var varParcs=[["8.858356","54.129056","Titel","ein paar Daten mehr"]["1,"2","Titel","ein paar Daten mehr"]["3","4","Titel","ein paar Daten mehr"]["5","6","Titel","ein paar Daten mehr"]];

//Dann kommt der interessante Teil, auch hier werde ich vereinfachen, um die Hilfe zu erleichtern:
OpenLayers.Lang.setCode('de');
    
    // Position und Zoomstufe der Karte
    var lon = 10.426025;
    var lat = 51.781436;
    var zoom = 6;

    map = new OpenLayers.Map('map', {
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG:4326"),
        controls: 
        	[
	            new OpenLayers.Control.Navigation(),
	            new OpenLayers.Control.LayerSwitcher(),
	            new OpenLayers.Control.PanZoomBar()
	        ],
        maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34, 20037508.34),
        numZoomLevels: 18,
        maxResolution: 156543,
        units: 'meters'
    });

 
  var mapnik = new OpenLayers.Layer.OSM();	//Kartenlayer erzeugen
  map.addLayer(mapnik);
  
  /* Es werden noch ein paar mehr Layers angelegt
  var layerParks =  .......
  */
    
  jumpTo(lon, lat, zoom);
    
  // Die folgenden Variablen sind mir - bis auf die Icons - nicht ganz klar. Aber ich glaube nicht, dass die mit dem Schließen der Popups etwas zu tun haben.
  var size = new OpenLayers.Size(21, 25);
  var sizeHaupt= new OpenLayers.Size(26, 42);
  var sizeWind= new OpenLayers.Size(58, 69);
  var sizeWald = new OpenLayers.Size(39, 52);
  var sizeBeratung = new OpenLayers.Size(42, 30);
  var sizeService = new OpenLayers.Size(43, 40);
  var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
  var middleWind = new OpenLayers.Pixel(-(sizeWind.w/2), -sizeWind.h/2);
  var middleWald = new OpenLayers.Pixel(-(sizeWald.w/2), -sizeWald.h/2);
  var middleService = new OpenLayers.Pixel(-(sizeService.w/2), -sizeService.h/2);
  var middleBeratung = new OpenLayers.Pixel(-(sizeBeratung.w/2), -sizeBeratung.h/2);
  var icon = new OpenLayers.Icon('http://www.openstreetmap.org/openlayers/img/marker.png',size,offset);
  var iconHaupt = new OpenLayers.Icon('bilder/osm/thron.png',sizeHaupt,offset);
  var iconWind = new OpenLayers.Icon('bilder/osm/wind-orange.png',sizeWind,middleWind);
  var iconWald = new OpenLayers.Icon('bilder/osm/baum.png',sizeWald,middleWald);
  var iconBeratung = new OpenLayers.Icon('bilder/osm/telefon.png',sizeBeratung,middleBeratung);
  var iconService = new OpenLayers.Icon('bilder/osm/service.png',sizeService,middleService)
  
 /******************************/
  var x = 0;
  var y = 0;

// Dann werden für jeden Eintrag im Array die Inhalte in eine vorläufige Variable geschrieben und in String umgewandelt, um beim addMarker darauf zuzugreifen

for(var i = 0; i < varParcs.length; i++) {
  x = varParcs[i][0];
  y = varParcs[i][1];						 
  y = parseFloat(y);
  x = parseFloat(x);

  var bez = varParcs[i][2];
  /* Noch einige Variablen mehr 
  var typ = ...
  ...
  */

  bez = String(bez);
  /* Noch einige Umwandlungen mehr 
  typ = String( ...
  ...
  */
						
  // Eigentlich findet der addMarker-Aufruf mithilfe viele if-Abfragen statt, um den Popup mit den richtigen Angaben auf das richtige Layer zu bekommen. 
  // Statt dessen zeige ich einen beispielhaften Aufruf.
  addMarker(layerParks, x, y, "<b>Windpark<br>" + bez + "</b><br>Anlagentyp: " + typ + "<br>WEA-Anzahl: "+ anz + "<br>Nennleistung: " + nen + "<p><img src=\"wind-farm.png\"></p>", iconWind.clone());						
}

Ich hoffe, jemand kann mir helfen.
Immerhin arbeiten fast alle OSM-Projekte, die ich gesehen habe, so wie ich es will :wink:

Lieben Gruß
Chricken

Obwohl ich mich deinem Willen nicht beugen werde, sollte es so gehen:


function popupClear() {
    //alert('number of popups '+map.popups.length);
    while( map.popups.length ) {
         map.removePopup(map.popups[0]);
    }
}

und dann irgendwo “popupClear();” aufrufen. Z.B vor dem neuen Popup.

Gruss
walter

Tach.

Leider hast Du Dein Script sehr unvollständig gepostet. Ideal für eine Fehlersuche wäre eine abrufbare Seite im Netz.

Also: wenn Dein Script irgendwo ein:

map.addPopup(x)

enthält, mach daraus ein

map.addPopup(x, true)

Das zweite Argument wählt, ob andere Popups geschlossen werden sollen. Default: null→false→ nein.

Orange Grüße
Der Assistent

Besserwisser Spielverderber :wink:

Gruss
walter

p.s. manchmal denke ich zu sehr “um die Ecke” und da finde ich 'ne Lösung, die ich vor Jahren mal verwendet habe :frowning:

Hallo,

vielen Dank für die schnelle und kompetente Hilfe.
Das Argument im addPopup war die Lösung.
Jetzt funktioniert es wie es soll.

Falls Ihr es noch immer einsehen wollt:
Ich will keine unfertigen Projekte posten.
Aber es ist für die Webseite von Prokon.net.
Wenn der Relaunch vollzogen ist, dann könnt Ihr dort die Karte einsehen.
Ich will noch schauen, dass die Karten auf dem eigenen Server gehostet werden. Wir wollen das freie Projekt ja nicht unnötig belasten.

Lieben Gruß
Christian

Tach.

Es geht nicht um “das Projekt einsehen”.

Sondern Fehler können sich an den unmöglichsten Stellen verstecken, die Du nicht verdächtigst und auch nicht verdächtigen kannst. Es ist wirklich ärgerlich, wenn man an völlig falschen Stellen blind herumstochert oder herumgestochert hat, während man im Source oder auf der Fehlerkonsole oder im Firebug den Fehler sofort sehen könnte.

Die defekte Seite mit Blinddaten bereitzustellen ist ein kleines Entgegenkommen denen gegenüber, die hier für lau Fehler suchen und Fixes anbieten. Das gilt nicht speziell für Dich, sondern für alle, die um Hilfe bitten.

Orange Grüße
Der Assistent.