Rendre la superposition personnalisée cliquable (API GoogleMaps V3))

j'ai une classe de superposition personnalisée (ImageOverlay) qui hérite de google.maps.OverlayView. Je veux qu'il réponde à Google Maps click events (pas seulement DOM click events) mais tout simplement en utilisant addListener ne semble pas faire l'affaire.

par exemple, j'ai un shapes array qui contient un mélange de google.maps.Polygon et ImageOverlay objets:

for (var i in shapes) {
  google.maps.event.addListener(shapes[i], 'click', function(){alert('hi')});
}

cliquer sur les polygones déclenche une alerte mais cliquer sur les superpositions personnalisées ne fait rien.

Comment faire pour que L'API GoogleMaps traite des superpositions comme cliquable?

27
demandé sur Tamlyn 2010-07-29 15:09:51

4 réponses

mise à Jour de la v3: overlayLayer n'accepte plus les évènements de souris. Ajouter votre superposition overlayMouseTarget à la place, ajoutez l'écouteur, et il devrait recevoir les évènements de la souris normalement.

//add element to clickable layer 
this.getPanes().overlayMouseTarget.appendChild(div);

// set this as locally scoped var so event does not get confused
var me = this;

// Add a listener - we'll accept clicks anywhere on this div, but you may want
// to validate the click i.e. verify it occurred in some portion of your overlay.
google.maps.event.addDomListener(div, 'click', function() {
    google.maps.event.trigger(me, 'click');
});

voir: http://code.google.com/apis/maps/documentation/javascript/reference.html#MapPanes

56
répondu Tim 2013-04-23 09:09:38

L'API Maps ne peut pas automatiquement déterminer quelles parties de votre superposition doivent être cliquables (c'est-à-dire si vous rendez une image avec un fond transparent, si serait jusqu'à votre classe de superposition pour déterminer si les clics dans la région transparente comptent comme des clics valides ou non).

vous devez ajouter des écouteurs DOM aux superpositions que vous dessinez, puis déclencher votre propre événement de clic de L'API Maps s'il s'agit d'un clic valide.

Exemple:

FooBar.prototype.onAdd = function() {
  // Create a div and append it to a map pane. 
  var div = document.createElement('div');
  div.style = "height: 100px; width: 100px";
  this.getPanes().overlayLayer.appendChild(div);

  // set this as locally scoped var so event does not get confused
  var me = this;

  // Add a listener - we'll accept clicks anywhere on this div, but you may want
  // to validate the click i.e. verify it occurred in some portion of your overlay.
  google.maps.event.addDomListener(div, 'click', function() {
    google.maps.event.trigger(me, 'click');
  });

  // Position your overlay etc.
}
</code>
12
répondu plexer 2011-12-18 12:00:42

Vous pouvez également vouloir arrêter la propagation d'événements, de sorte que les clics sur la superposition ne se propagera pas aux éléments ci-dessous (par exemple, polygones, marqueurs, etc, dépend de votre panneau)

//add element to clickable layer 
this.getPanes().overlayMouseTarget.appendChild(div); // or floatPane

// set this as locally scoped var so event does not get confused
var me = this;

// Add a listener - we'll accept clicks anywhere on this div, but you may want
// to validate the click i.e. verify it occurred in some portion of your overlay.
google.maps.event.addDomListener(div, 'click', function(events) {
    if (/*handling event*/) {
        event.preventDefault(); // The important part
    }
    else {
        google.maps.event.trigger(me, 'click');
    }
});
0
répondu Nir Soudry 2016-04-14 14:12:43

pour GoogleAPI v3. Comme les gars l'ont dit ci-dessous, mais avec quelques corrections:

LocalityCustomOverlay.prototype.onAdd fonction:

var self = this;
google.maps.event.addDomListener(this._div, 'click', function(event) {
    // stop click reaction on another layers
    event.stopPropagation();

    // add also event to 3rd parameter for catching
    google.maps.event.trigger(self, 'click', event); 
});

à l'Extérieur, directement sur votre overlays:

google.maps.event.addListener(CUSTOM_OVERLAY_OBJECT, 'click', function(event) {
    console.log('event:', event);
});
0
répondu dimpiax 2016-04-18 17:34:32