В моем веб-приложении я хочу разрешить пользователям устанавливать размер контейнера карты.
Все работало нормально, когда контейнер был немного расширен (очевидно, это потому, что плитки, которые были сразу за границей, уже были загружены). Однако, когда контейнер значительно расширяется (в следующем примере шириной от 300 до 1000 пикселей), остается свободное место.
Как заставить карту перерисоваться и адаптироваться к новому размеру?
Обращение redraw()
ко всем слоям не помогло. Ни один не сделал увеличение и уменьшение.
Я протестировал это с описанными результатами в Opera, Chrome и Firefox. В IE8, к удивлению, проблема не возникла, и карта автоматически адаптировалась.
Упрощенная веб-страница для тестирования:
<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>
источник
body onload=init()
иinit
инициализирует карту. Это из-за этого? Кроме того, это будет хорошим решением для адаптивного дизайна?window.onload=window.onresize=function(){//resize here
, СпасибоsetInterval
который запускается каждые 200 мс, а затем иметь логическое значениеvar didResize
, которое установлено в значениеtrue
onresize()
и установленоfalse
послеmap.updateSize()
.Да, используйте map.updateSize (), как говорит Вадим (также не уверен, почему задержка!) Документация
Я обычно помещаю полноэкранный переключатель на карты, который работает просто путем переключения класса css контейнера карты и последующего вызова updateSize ()
источник
Это не элегантно, но у меня это хорошо сработало
источник
Еще один комментарий к первому (правильному) ответу:
Timeout-Event необходим, если вы ожидаете события window.resize. В противном случае размер карты будет изменяться каждую миллисекунду, если пользователь начнет изменять размер окна (мне это нужно для Firefox). Поэтому, если вы хотите проверить размер окна, тайм-аут весьма полезен, соответственно. необходимо. См .: /programming/5489946/jquery-how-to-wait-for-the-end-or-resize-event-and-only-then-perform-an-ac или событие завершения изменения размера jQuery
(извините, я не могу добавить комментарий, поэтому другой ответ)
источник
Я перепробовал все вещи, описанные здесь, но у меня ничего не получалось. Итак, я понял, что когда я помещал «полноэкранный» класс на карту, событие resize не было запущено. Я исправляю это с помощью:
источник
Использование метода setTimeout, описанного выше, не имеет для меня большого смысла (возможно, это обходной путь для более старой версии OL), но setTimeout можно использовать для уменьшения количества вызовов map.updateSize () и другого связанного кода, такого как это:
источник
Я думаю, что изменение стиля карты div автоматически изменит размер панели карты.
я надеюсь, что это поможет вам ...
источник
Это работает для меня:
$ NextTick важен, потому что он позволит дождаться следующего обновления, прежде чем учитывать новый размер контейнера карты.
источник