我一次使用几张传单地图。可以动态创建和删除它们。但是当使用map.remove()销毁地图时会出现内存泄漏。出现分离的DOM树。您可以在Chrome开发工具中看到它。
我用来重新创建div和map的示例函数:
var map, mapDiv;
recreateMap = function(){
// destroy previous map and div
if(map) map.remove();
if(mapDiv) mapDiv.parentNode.removeChild(mapDiv);
// create new map div
var randomDivId = 'mapId' + new Date().getTime();
mapDiv = document.createElement('div');
mapDiv.id = randomDivId;
mapDiv.style.height = '200px';
mapDiv.style.width = '200px';
document.getElementsByTagName('body')[0].appendChild(mapDiv);
// attach map to div
map = L.map(randomDivId).setView([51.505, -0.09], 13);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(map);
map.invalidateSize();
};
如何正确销毁传单地图?
答案 0 :(得分:1)
假设您使用以下内容创建传单地图
var lat =39, long = 40;
var coords=[lat,long];
var zoomLevel=13;
var mapInstance = leafLet.map(mapContainerId).setView(coords, zoomLevel);
您可以使用以下代码将其删除
if (mapInstance && mapInstance.remove) {
mapInstance.off();
mapInstance.remove();
}
如果您正在使用非阻塞javascript代码或异步调用,则可以根据需要使用计时器来确保代码不会出错。以下是相同的示例实现
var timeoutIndex=0;
var watcher=window.setInterval(function(){
timeoutIndex++;
if (mapInstance && mapInstance.remove) {
mapInstance.off();
mapInstance.remove();
window.clearInterval(watcher);
}
if(timeoutIndex >50) { //wait for 5 seconds before giving up
window.clearInterval(watcher);
}
},100);
对我有用。猜猜它也对您有帮助
答案 1 :(得分:0)
可能先尝试unload
地图? (文档说使用remove
方法时会自动卸载地图,但是值得额外拍摄并尝试先手动卸载它。
答案 2 :(得分:0)
我遇到了同样的问题,在花了很多时间之后,这个问题的最佳解决方案是将地图容器放在div
中,当你想要重新生成地图时,删除所有的div
的HTML并创建一个新的地图容器:
<div id="map-bx">
<div id="map"></div>
</div>
<script type="text/javascript">
// Map init
</script>
当你想要像这样重新生成(破坏)地图时:
<script type="text/javascript">
$("#map-box").html("");
$("#map-box").html('<div id="map"></div>');
// map init code
</script>
就我而言,map.remove()
或map.unload()
不起作用。
答案 3 :(得分:0)
如果您有多张地图,则需要将每张地图放入不同的地图
var map1 = L.map(mapDiv1);
var map2 = L.map(mapDiv2);
您还可以创建一个控制地图初始化和容器的功能:
function BoolMapInit(map, mapDiv) {
return (map != null && map._container.id == divMap);
}
删除现有地图的功能:
function RemoveExistingMap(map) {
if (map != null) {
map.remove();
map = null;
}
}
希望这个帮助;)