J'essaie d'insérer une carte Google dans un modal à l'aide de Twitter Bootstrap. Le modal apparaît avec la forme de la carte présente, mais seule une partie de la carte est affichée, le reste est gris. Lors du redimensionnement de l'écran, la carte s'affiche toujours correctement, même si elle est centrée au mauvais endroit.
J'ai effectué des recherches et trouvé des suggestions telles que l'appel de l'événement de redimensionnement de la carte ou la définition de la largeur maximale de l'image de la carte, mais aucune de ces suggestions n'a été utile jusqu'à présent. Il semble que la carte ne parvienne pas à déterminer sa taille correcte tant qu'elle se trouve dans un élément caché.
function initialize() {
var mapOptions = {
center: new google.maps.LatLng(51.219987, 4.396237),
zoom: 12,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("mapCanvas"),
mapOptions);
var marker = new google.maps.Marker({
position: new google.maps.LatLng(51.219987, 4.396237)
});
marker.setMap(map);
}
<div class="modal hide fade" id="myModal">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h3></h3>
</div>
<div class="modal-body">
<div id="mapCanvas" style="width: 500px; height: 400px"></div>
</div>
<div class="modal-footer">
<a href="#" class="btn" data-dismiss="modal">Close</a>
</div>
</div>
J'utilise Twitter Bootstrap v2.0.4. J'ai besoin d'aide car je ne parviens pas à déclencher l'événement de redimensionnement correctement ni à éditer le fichier css afin de laisser la carte Google seule.
Google Maps affiche en effet les zones "grises" lorsqu'elles sont placées dans un élément dynamique (par exemple: un élément qui redimensionne, estompe, etc.). Vous avez raison de déclencher la fonction "redimensionner", qui devrait être appelée une fois l'animation terminée (l'événement shown.bs.modal
Dans Bootstrap 3 ou shown
événement dans Bootstrap 2):
$("#myModal").on("shown.bs.modal", function () {
google.maps.event.trigger(map, "resize");
});
Dans Bootstrap 2, vous ferez:
$('#myModal').on('shown', function () {
google.maps.event.trigger(map, "resize");
});
(où map
est le nom de la variable de votre carte (voir documentation Google Maps pour plus de détails), et #myModal
l'identifiant de votre élément).
UPDATE 2018-05-22
Avec une nouvelle version de rendu dans la version 3.32 de l'API JavaScript de Maps, l'événement resize ne fait plus partie de la classe Map
.
La documentation indique
Lorsque la carte est redimensionnée, le centre de la carte est fixe
Le contrôle plein écran conserve maintenant le centre.
Il n'est plus nécessaire de déclencher l'événement de redimensionnement manuellement.
source: https://developers.google.com/maps/documentation/javascript/new-renderer
google.maps.event.trigger(map, "resize");
n'a aucun effet à partir de la version 3.32
Pour moi, ça marche comme ça (Bootstrap 3):
$("#contact-modal").on("shown.bs.modal", function () {
google.maps.event.trigger(map, "resize");
});
Je voulais souligner quelques modifications que j'ai apportées, en fonction de la réponse initiale, pour que cela fonctionne avec Bootstrap 3 (consultez la rubrique tilisation des modaux ).
// Resize map to show on a Bootstrap's modal
$('#map-modal').on('shown.bs.modal', function() {
var currentCenter = map.getCenter(); // Get current center before resizing
google.maps.event.trigger(map, "resize");
map.setCenter(currentCenter); // Re-set previous center
});
Dans ce cas, je m'occupe également de la mise à jour récente de la carte, sur la base de cette question suggérée dans le commentaire de Jan-Henk à la première réponse.
Lorsque vous utilisez Bootstrap 3, vous devez utiliser ce qui est fourni dans leur documentation, c'est-à-dire au lieu de "shown", utilisez "shown.bs.modal".
Exemple:
$('#modal').on('shown.bs.modal', function () {
initialiseMap();
});
La réponse acceptée s'est débarrassée des cases grises, mais ne centre pas la carte aux bonnes coordonnées pour moi. Ma solution consistait simplement à attendre le rendu de la carte après l'affichage du modal.
$('#modal').on('shown', function () {
initialize();
});
La réponse acceptée fonctionne effectivement dans ce cas où le contenu de la div est local. Malheureusement, j'ai eu le même problème lors de l'affichage d'une carte incluse dans les données distantes. Obtenir le handle de la carte et appeler redimensionner n'a pas correctement centré ma carte. Voici comment j'ai résolu le problème dans ma situation de données distantes.
<script type="text/javascript">
function renderMap() {
var point = new google.maps.LatLng(51.219987, 4.396237);
var map = new google.maps.Map(document.getElementById('map'), {
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 13,
center: point
});
var marker = new google.maps.Marker({ position: point, map: map, icon: 'http://www.google.com/intl/en_us/mapfiles/ms/icons/red-dot.png' });
}
</script>
<script type="text/javascript">
$(document).ready(function () {
$('#dlgReportInfo').on('shown', function () {
renderMap();
});
})
</script>
De cette façon, la carte est déjà redimensionnée dans la boîte de dialogue avant de l'initialiser. Espérons que cela aidera les autres avec une situation similaire.
le code suivant fonctionne parfaitement pour bootstrap 3
$("#mapModal").on("shown.bs.modal", function () {initialize();});
this works for me
**<!-- Modal -->**
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Google Maps</h4>
</div>
<div class="modal-body">
<div id="map_canvas" style="width:auto; height: 500px;"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
**Button**
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">View Map</button>
**javascript**
<script type="text/javascript">
function initializeMap() {
var mapOptions = {
center: new google.maps.LatLng(51.219987, 4.396237),
zoom: 12,
mapTypeId: google.maps.MapTypeId.HYBRID
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
mapOptions);
var marker = new google.maps.Marker({
position: new google.maps.LatLng(51.219987, 4.396237)
});
marker.setMap(map);
}
//show map on modal
$('#myModal').on('shown.bs.modal', function () {
initializeMap();
});
</script>
espérons que cela aidera
J'ai résolu avec la solution:
$('#myId').on('shown.bs.modal', function () {
initializeMap() // with initializeMap function get map.
});
// événement shown.bs.modal sur modal bootstrap s'affichera après le show modal, n'utilisez pas show.bs.modal car cela appelez avant le spectacle modal.
essaye ça !
<div class="modal fade" id="map_modal" tabindex="-1" role="dialog" aria- labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body"><div id="map_canvas" style="width:530px; height:300px"></div></div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
var map = marker = new Array();
geocoder = NULL;
function addPoint(location, id, mapId) {
if (!marker[id]) {
marker[id] = new google.maps.Marker({
position: location,
map: map[mapId],
draggable: true
});
}
}
function placeMarker(location, editStr, id) {
if (!marker[id]) {
marker[id] = new google.maps.Marker({
position: location,
map: map[id],
draggable: false
});
}
marker[id].setPosition(location);
map[id].setCenter(location);
$("#longitud").val(location.lat());
$("#latitud").val(location.lng());
}
function initializeMap(id, div_id, lat, lng, editStr) {
if (!geocoder)
geocoder = new google.maps.Geocoder();
if (!map[id]) {
var coordinates = new google.maps.LatLng(lat, lng);
var myOptions = {zoom: 8, center: coordinates, mapTypeId: google.maps.MapTypeId.ROADMAP}
map[id] = new google.maps.Map(document.getElementById(div_id), myOptions);
google.maps.event.addListener(map[id], 'click', function(event) {
placeMarker(event.latLng, editStr, id);
});
placeMarker(coordinates, editStr, id);
}
}
$('#map_modal').on('shown.bs.modal', function(e) {
initializeMap("#newMaps", "map_canvas", 10.444598, -66.9287, "");
})
Je suis également confronté au même problème, mais je le résous en attendant l'état "inactif" de la carte (c'est-à-dire lorsqu'il est terminé), puis en appelant le redimensionnement:
google.maps.event.addListenerOnce(map, 'idle', function () {
var currentCenter = map.getCenter();
google.maps.event.trigger(map, 'resize');
map.setCenter(currentCenter);
map.setZoom(15);
});
après
map = new google.maps.Map(document.getElementById('map-canvas2'),mapOptions);