2009-05-31 9 views
2

J'essaie de créer une carte Google avec plusieurs marqueurs, qui charge une alerte lorsqu'un clic est effectué sur un marqueur.Google Maps - fenêtre de chargement sur le marqueur cliquez sur

var map = null; 
function setupMap() { 

    map = new GMap2(document.getElementById("map")); 
    map.setUIToDefault(); 
    map.setCenter(new GLatLng(0, 0), 1); 
    map.enableDoubleClickZoom(); 

    // Create the marker icon - will be repeated for each icon but 
    // truncated for brevity in example 
    var icon1 = new GIcon(G_DEFAULT_ICON); 
    icon1.image = "uploads/1.jpg"; 
    icon1.shadow = ""; 
    icon1.iconSize = new GSize(50, 50); 

    var latlng = new GLatLng(0, 0); 
    markerOptions = { icon:icon1 };  
     marker1 = new GMarker(latlng, markerOptions); 
    map.addOverlay(marker1); 
    GEvent.addListener(marker1, "click", loadInfo(1));  

} 

function loadInfo(a) { 
    alert(a); 
} 

window.onload = setupMap; 

Dans l'exemple de travail, je vais passer l'objet marqueur loadinfo(), puis charger un InfoWindow, mais pour l'instant, je suis juste essayer d'obtenir l'action de se produire lorsque le marqueur est cliqué. Qu'est-ce qui se passe réellement, c'est qu'une boîte d'alerte est en cours de chargement (avec le '1', comme prévu) lorsque la carte se charge. Plusieurs marqueurs ne chargent pas plusieurs boîtes d'alerte, et après que la boîte d'alerte initiale a été chargée (ce que je ne veux pas), cliquer sur les marqueurs ne fait rien.

Toute aide est très appréciée, merci!

Répondre

5

Dans votre appel addListener, vous appelez réellement loadInfo au lieu de passer une référence. Effectuez les opérations suivantes à la place:

GEvent.addListener(marker1, "click", function() { 
    loadInfo(1); 
});  

Cela va créer une fonction anonyme qui enveloppe votre méthode loadInfo, appelant la méthode lorsque la fonction anonyme est exécutée.

Sinon, si vous ne l'utilisez aucun paramètre loadInfo, supprimant simplement les parenthèses fonctionnerait aussi:

GEvent.addListener(marker1, "click", loadInfo);  

Quelque chose à garder à l'esprit lors de l'utilisation de telles références de fonction est la portée dans laquelle il sera appelé. Si vous deviez utiliser la référence 'this', vous rencontrerez la situation où 'this' dans la fonction de rappel ne se référera en fait pas à la portée dans laquelle il a été créé, mais à la portée dans laquelle il est en cours d'exécution qui ne sera probablement pas contient les champs ou les méthodes que vous prévoyez appeler, ce qui entraîne des erreurs indiquant Undefined à la place. Comme Jonathan le fait remarquer, vous devrez utiliser les méthodes call() et apply() pour vous lier explicitement afin de vous assurer que votre fonction s'exécute dans la bonne portée.

1

Vous appelez loadInfo dans le fichier .addListener, sans lui fournir de référence.

GEvent.addListener(marker1, "click", loadInfo(1)); 

essayer:

function wrap(method) { 
    var args = Array.prototype.slice.apply(arguments,1); 
    return function() { 
     return method.apply(this,args); 
    } 
} 


GEvent.addListener(marker1, "click", wrap(loadInfo,1)); 

voir http://www.alistapart.com/articles/getoutbindingsituations pour plus d'informations sur les arguments de liaison aux fonctions. également voir https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/apply pour plus d'informations sur la très utile apply() (vous aussi recommandé regardez appel(), ainsi)

1

loadInfo(1) signifie d'exécuter cette fonction immédiatement, mais vous devez passer une fonction de rappel à la méthode GEvent.addListener(). Pour cela, vous pouvez utiliser la fonction anonyme:

GEvent.addListener(marker1, "click", function() { loadInfo(1) }); 
0

Même si GEvent.addListener (marker1, "cliquez sur", function() { loadinfo (1); }); a été utilisé, je ne suis pas obtenir le lien vers le marqueur pour se déplacer suivant

Questions connexes