Una forma más limpia de implementar el enfoque setTimeout()
es activar eventos personalizados para clics individuales.
La siguiente función toma cualquier objeto de la interfaz de Google Maps (por ejemplo, mapa, marcador, polígono, etc.) Y establece dos eventos personalizados:
singleclick
: llamados 400ms después de un clic si no hay otros clics han producido
firstclick
: llamada cuando se produce un evento de clic, a menos que un clic ya se ha producido en los últimos 400 ms (esto es útil para mostrar algún tipo de información haga clic inmediata al usuario)
function addSingleClickEvents(target) {
var delay = 400;
var clickTimer;
var lastClickTime = 0;
google.maps.event.addListener(target, 'click', handleClick);
google.maps.event.addListener(target, 'dblclick', handleDoubleClick);
function handleClick(e) {
var clickTime = +new Date();
var timeSinceLastClick = clickTime - lastClickTime;
if(timeSinceLastClick > delay) {
google.maps.event.trigger(target, 'firstclick', e);
clickTimer = setTimeout(function() {
google.maps.event.trigger(target, 'singleclick', e);
}, delay);
} else {
clearTimeout(clickTimer);
}
lastClickTime = clickTime;
}
function handleDoubleClick(e) {
clearTimeout(clickTimer);
lastClickTime = +new Date();
}
}
se puede utilizar de este modo:
var map = ....
addSingleClickEvents(map);
google.maps.event.addListener(map, 'singleclick', function(event) {
console.log("Single click detected at: " + event.latLng);
}
Esta solución no funciona si su función 'placeMarker()' puede ser llamada a veces además de hacer clic en eventos (a menos que siempre llame a 'mapZoom = map.getZoom()' antes de llamar a 'placeMarker() '); Encontré la solución de @ ShogunPanda más flexible en esta circunstancia. –