Bootstrap 数据切换选项卡不下载传单Map

carvr3hs  于 7个月前  发布在  Bootstrap
关注(0)|答案(4)|浏览(74)

我使用标签来显示清晰的内容,但其中一个停止下载,因为它是在数据切换标签。这是一个传单Map。这里是代码:
导航条代码:

<ul class="nav nav-tabs">
    <li class="active"><a data-toggle="tab" href="#home">Données principales</a></li>
    <li><a data-toggle="tab" href="#carte">Carte</a></li>
</ul>
<div class="tab-content">
    <div id="home" class="tab-pane fade in active">Lorem ipsum</div>
    <div id="carte" class="tab-pane fade"> **//see script below\\** </div>
</div>

字符串
脚本:

<div id="carteBenef"></div>
      <script type="text/javascript">
          $(document).ready(function () {
              var map = new L.Map('carteBenef');
              var cloudmadeUrl = 'http://{s}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png',
                     subDomains = ['otile1', 'otile2', 'otile3', 'otile4'],
                     cloudmadeAttrib = 'Data, imagery and map information provided by <a href="http://open.mapquest.co.uk" target="_blank">MapQuest</a>, <a href="http://www.openstreetmap.org/" target="_blank">OpenStreetMap</a> and contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank">CC-BY-SA</a>';
              var cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttrib, subdomains: subDomains});
              var iades = new L.LatLng(<?php echo $beneficiaire->latitude . ', ' . $beneficiaire->longitude; ?>)
              map.addLayer(cloudmade).setView(iades, 15);
              var benefLocation = new L.LatLng(<?php echo $beneficiaire->latitude . ', ' . $beneficiaire->longitude; ?>);
              var benef = new L.Marker(benefLocation);
              map.addLayer(benef);
              benef.bindPopup("<?php echo htmlspecialchars($beneficiaire->nom) . ' ' . htmlspecialchars($beneficiaire->prenom); ?>").openPopup();
          });
      </script>


Map在我把它放在标签之前就已经出现了,有人知道为什么它现在不工作了吗?

lawou6xi

lawou6xi1#

如果您的Leaflet map在调整浏览器窗口大小后突然正常工作,那么您会遇到经典的“map初始化时map容器大小无效”:为了正常工作,Leaflet会在您初始化map时读取map容器大小(L.map("mapContainerId"))。
如果应用程序隐藏了该容器,(通常通过CSS display: none;,或一些框架选项卡/模态/任何.)或以后更改其尺寸,Leaflet将不知道新的大小。因此,它将无法正确呈现。通常,它只为它认为显示的容器的一部分下载瓷砖。这可以是左上角的一个瓷砖,如果一个容器在Map初始化时完全隐藏。
这个错误经常出现在将map容器嵌入“tab”或“modal”面板时,可能使用流行的框架(Bootstrap,Angular,Ionic等)。
Leaflet监听浏览器窗口调整大小事件,并在发生时再次读取容器大小。这解释了为什么Map突然在窗口调整中起作用。
您也可以在选项卡面板显示时通过调用map.invalidateSize()手动触发此更新(例如,在选项卡按钮单击时添加侦听器),至少在容器第一次以正确的尺寸呈现时。
至于实现选项卡按钮单击侦听器,请在SO上执行关于该主题的新搜索:对于大多数流行的框架,您应该有大量可用的资源。

dy1byipe

dy1byipe2#

首先,感谢@ghybs对为什么在这些情况下传单Map没有正确显示的解释。
对于那些尝试@ghybs的答案失败的人,你应该尝试调整浏览器的大小,而不是调用map对象的方法:

window.dispatchEvent(new Event('resize'));

字符串
正如@MarsAndBack所说,此修复可能会导致Leaflet的invalidateSize提供的平移/动画/等功能出现问题。

w8f9ii69

w8f9ii693#

我有这个问题,因为我使用modal bootstarp.它没有解决无论如何.我尝试了map.invalidateSize()window.dispatchEvent(new Event('resize'));,但没有固定.
最后,它被这样固定了:
$('#map-modal').on('shown.bs.modal', function(event) {});
'shown.bs.modal'事件意味着当模态完全加载并且没有任何大小上的混乱时,现在在里面写代码。

eagi6jfj

eagi6jfj4#

对于那些像我一样无法用宝贵的@ghybs解释(map.invalidateSize())解决这个问题,而能够用@gangai-johann one解决的人来说,你仍然有机会用正确的方式解决这个问题。把你的无效指令放在一个settool中,因为现在分派这个指令可能还为时过早。

setTimeout(() => {
    this.$refs.mymap.mapObject.invalidateSize()
}, 100)

字符串
有关详细说明,请参阅https://stackoverflow.com/a/56364130/4537054答案。

相关问题