2009-05-06 9 views
5

Ich habe einige Google Maps/Javascript Probleme. Ich denke, ich weiß, was das Problem ist, aber ich kenne keinen Weg.Google Maps Problem: Verschlüsse & Passing durch Referenz

Ein Beispiel für mein Problem ist here. Auf welchen Marker Sie auch klicken, der zweite erscheint. Ich übergebe offensichtlich die falschen Informationen in meinen Ereignis-Listener, aber ich kann einfach nicht scheinen, den Code richtig zu bekommen. Hier ist eine abgespeckte Teil des Codes:

Zuerst, hier ist ein Teil meines Codes:

if (GBrowserIsCompatible() && mapResults != null) { 
    // Read in the JSON 
    var mapDetailsArray = loadJSON(); 

    // Create a map 
    var map = new google.maps.Map2(document.getElementById(elementId)); 
    map.setCenter(new google.maps.LatLng(mapDetailsArray[0].getLatitude(), 
     mapDetailsArray[0].getLongitude()), 13); 
    map.addControl(new google.maps.SmallMapControl()); 

    // Add the points and center 
    var mgr = new google.maps.MarkerManager(map); 
    var bounds = new google.maps.LatLngBounds(); 
    for (var i = 0; i < mapDetailsArray.length; i++) { 
    var mapDetails = mapDetailsArray[i]; 

    var point = new google.maps.LatLng(mapDetails.getLatitude(), mapDetails 
     .getLongitude()); 
    bounds.extend(point); 

    // Create our marker 
    var marker = new google.maps.Marker(point); 

    // What action do we use to show the hover 
    var infoAction = "mouseover"; 

    marker.value = mapDetails; 

    google.maps.Event.addListener(marker, infoAction, function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }); 

    mgr.addMarker(marker, 1); 
    } 
    mgr.refresh(); 
} 

„marker.value“ immer endet Satz als letzter Wert dessen, was mapDetails war. Wenn überhaupt, würde ich erwarten, dass es "undefiniert" ist, sobald die Schleife beendet ist, sollte dieser Wert nicht weg sein? Ich habe verschiedene verschiedene Werte ausprobiert (z. B. marker.value = i + 1;), aber es wird immer noch als der gleiche Wert für beide Punkte angezeigt.

Hat jemand eine Idee, wie ich die richtigen Werte in den Event-Listener übergeben kann? diese

Antwort

6

Wechsel:

google.maps.Event.addListener(marker, infoAction, function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }); 

dazu:

google.maps.Event.addListener(marker, infoAction, (function(marker, point, map) { return function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }})(marker, point, map)); 

Das schafft die Schließung Sie wollen.

für Klarheit Split out:

var f = function(marker, point, map) 
{ 
    return function() 
    { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    } 
} 

google.maps.Event.addListener(marker, infoAction, f(marker, point, map)); 
+0

, die den Trick tat. Prost Greg. Ich habe sowas schon früher probiert, aber ohne die return function() {...} um den Code zu wickeln. –

+0

Ich habe das gleiche Problem erfahren und dasselbe Problem behoben. Ich glaube, das ist ein Bug in Javascript. – SingleNegationElimination

+0

Ich glaube nicht, dass es ein Fehler ist, es ist einfach nicht sehr intuitiv – Greg

3

Die obige Antwort ist allerdings nicht sehr intuitiv - wie Greg sagte.

Wenn Sie einem Objekt ein Ereignis hinzufügen, wird dieses Objekt übergeben, sodass Sie innerhalb des Abschlusses auf dieses Objekt zugreifen können. Wenn Sie "marker.value" durch "this.value" ersetzt haben, wäre Ihr Problem gelöst worden. Wenn Sie mehr Material zu überliefern müssen, binden Sie es an das Objekt und geben es nach unten:

marker.a = 1 
marker.b = 2 
marker.c = 3 

Innerhalb der Schließung this.a 1 sein wird, und so weiter ..