2011-08-10 3 views

Répondre

4

Je suis tombé sur ce même problème aujourd'hui, certains flottant de Div personnalisée dessus de la carte devant être repositionné sur la carte de mouvement. Mon repositionnement a bien fonctionné tant que l'utilisateur s'arrêtait complètement après avoir traîné avant de laisser la souris partir (donc il n'y aurait pas d'élan), mais si l'on traînait rapidement et que l'on relâchait la div finirait un peu.

Pour résoudre ce problème, j'accroché dans l'événement de glisser l'événement idle:

var map = /* All the map config */ 
var stickyCenter = map.getCenter(); 
/* ... Code ... */ 
google.maps.event.addListener(map, 'drag', function(){ stickyCenter = map.getCenter(); }); 
google.maps.event.addListener(map, 'idle', function() { map.setCenter(stickyCenter); }); 

Ce qui se passe est que, après que vous avez traîné et la carte est venu à un arrêt (après l'élan est fait) la carte se remet en place.

Si l'accrochage est trop brusque, il est possible que l'on puisse faire un panoramique ou animer le mouvement d'une manière ou d'une autre. Espérons que cela aide, ce n'est pas parfait, mais c'est un moyen d'inverser la dynamique d'un événement de traînée.

+1

À partir de la version 3, vous pouvez vous connecter à l'événement 'center_changed', qui tiendra compte de l'intervalle entre les événements' dragend' et 'idle'. https://developers.google.com/maps/documentation/javascript/events –

+0

@DevinMcInnis Vous avez raison. Cela a également été discuté sur la question ouverte sur le code google ici: https://code.google.com/p/gmaps-api-issues/issues/detail?id=3543&q=idle&colspec=ID%20Type%20Status%20Introduced% 20Fixed% 20Summary% 20Stars% 20ApiType% 20Internal Plus précisément: « Ce cas d'utilisation peut être résolu en ajoutant un auditeur' idle' une fois 'dragend' événement est déclenché l'événement se déclenche à vide une fois que la carte est au repos.. Pour positionner la superposition, utilisez 'bounds_changed' ou' center_changed' au lieu de 'drag'" – EdgeCaseBerg

0

Je suis à peu près certaine qu'il est possible de contre-agir au moins. Quelqu'un s'il vous plaît corrigez-moi si je me trompe! Par souci de simplicité, par exemple, disons que votre conteneur de carte a un de 100vw et un height de 100vh. Vous appelez simplement getCenter() dans une fonction qui est appelée par un événement mouseup, puis utilisez ces coordonnées pour immédiatement setCenter()?

function initMap(){ 

    ... 

    var win = window; 
    google.maps.event.addDomListener(win, 'mouseup', setCoords); 
    function setCoords(){ 
     var x = myMap.getCenter(); 
     var lat = x.lat(); 
     var lng = x.lng(); 
     myMap.addListener('center_changed', function(lat, lng){ 
     myMap.setCenter(new google.maps.LatLng(lat, lng)); 
    }; 
}; 

Le code ci-dessus fonctionne réellement, mais le kicker est que cela fonctionne qu'une seule fois jusqu'à ce que le navigateur devient apparemment surchargé et produit l'erreur Uncaught RangeError: taille de la pile d'appel maximal dépassé.

Vous ne savez pas quoi faire maintenant.

Plus d'informations sur le here.

+0

L'écouteur center_changed définit le centre de la carte, ce qui déclenche un événement center_changed, créant une boucle infinie – geocodezip

+0

@geocodezip Merci d'avoir répondu. Vous avez raison, je me suis rendu compte qu'il y a un petit bout de temps, ce qui est marrant, c'est que vous vous attendez à ce qu'il fonctionne parfaitement sans ajouter 'myMap.addListener ...', mais il ne fonctionne pas comme si le code n'existait pas S'il vous plaît consulter mon autre fil http://stackoverflow.com/questions/39626454/functions-uncaught-rangeerror-maximum-call-stack-size-exceeded-with-google-m –

5

Utilisez l'option sans papier disablePanMomentum.: par exemple

new google.maps.Map(document.getElementById(id), { 
    disablePanMomentum: true, 
    backgroundColor: 'none', 
    disableDefaultUI: true, 
    center: { 
     lat: 40.674, 
     lng: -73.945 
    }, 
    zoom: 2, 
    ... 
+0

Un bon. curieux de savoir comment vous l'avez trouvé –

+1

@PedroAdameVergara Techniques d'ingénierie inverse ou de regex de base, faites votre choix – Orwellophile

+0

@Orwellophile pourrait vous expliquer comment vous utiliseriez des regex pour le savoir? J'aimerais savoir, à votre santé –