Dans mon application Web, je souhaite permettre aux utilisateurs de définir la taille du conteneur de carte.
Tout a bien fonctionné lorsque le conteneur a été légèrement agrandi (apparemment, c'est parce que les tuiles qui étaient juste derrière la frontière étaient déjà chargées). Cependant, lorsque le conteneur est considérablement développé (dans l'exemple suivant, de 300 à 1 000 pixels de largeur), il reste de l'espace vide.
Comment redessiner la carte et l'adapter à la nouvelle taille?
Appeler redraw()
sur toutes les couches n'a pas aidé. Ni zoom avant ni arrière.
J'ai testé cela avec les résultats décrits dans Opera, Chrome et Firefox. Dans IE8, étonnamment, le problème ne s'est pas produit et la carte s'est automatiquement adaptée.
Une page Web simplifiée pour les tests:
<html>
<head>
<style>
#mapbox {
width: 300px;
height: 500px;
border: 1px solid black;
}
</style>
<script src="http://openlayers.org/api/OpenLayers.js"></script>
</head>
<body>
<div id="mapbox"></div>
<input type="button" id="test" value="resize">
<script>
var map = new OpenLayers.Map('mapbox');
map.addLayer(new OpenLayers.Layer.OSM());
map.setCenter(
new OpenLayers.LonLat(1000000, 7000000), 5);
document.getElementById('test').onclick = function() {
document.getElementById('mapbox').style.width = '1000px';
}
</script>
</body>
</html>
la source
body onload=init()
etinit
initialise la carte. Est-ce à cause de cela? En outre, serait-ce une bonne solution pour une conception réactive?window.onload=window.onresize=function(){//resize here
. MercisetInterval
qui s'exécute toutes les 200 ms, puis avoir un booléenvar didResize
qui est défini surtrue
onresize()
, et défini surfalse
aprèsmap.updateSize()
est appelé.Oui, utilisez map.updateSize () comme le dit Vadim (également pas sûr pourquoi le retard!) Documentation
Je mets généralement un bouton bascule plein écran sur les cartes, ce qui fonctionne simplement en changeant la classe css du conteneur de carte, puis en appelant updateSize ()
la source
N'est pas élégant, mais cela a bien fonctionné pour moi
la source
Un autre commentaire à la première (correcte) réponse:
L'événement timeout est nécessaire si vous attendez l'événement window.resize. Sinon, la carte sera redimensionnée toutes les millisecondes si un utilisateur commence à redimensionner la fenêtre (j'en avais besoin pour Firefox). Par conséquent, si vous souhaitez vérifier la taille de la fenêtre, le délai d'expiration est très utile resp. nécessaire. Voir: /programming/5489946/jquery-how-to-wait-for-the-end-or-resize-event-and-only-then-perform-an-ac ou jQuery resize end event end
(désolé, je ne peux pas ajouter de commentaire, donc une autre réponse)
la source
J'ai essayé toutes les choses décrites ici mais rien n'a fonctionné pour moi. J'ai donc réalisé que lorsque je mettais une classe «plein écran» sur la carte, l'événement de redimensionnement n'était pas déclenché. Je corrige cela avec:
la source
La façon dont setTimeout est utilisé ci-dessus n'a pas beaucoup de sens pour moi (peut-être une solution de contournement pour une ancienne version OL), mais setTimeout peut être utilisé pour réduire le nombre d'appels à map.updateSize (), et tout autre code associé comme cette:
la source
je pense que changer le style de div de carte automatiquement changera la taille du panneau de carte.
J'espère que ça t'aide...
la source
Cela fonctionne pour moi:
Le $ nextTick est important car il permettra d'attendre la prochaine actualisation avant de prendre en compte la nouvelle taille du conteneur de carte.
la source