传单控制Joomla问题

Leaflet control Joomla issue

我已经创建了一个 Joomla 组件,并且在该组件中有一个 Leaflet 地图 window。 我使用带 Omnivore 插件的 Leaflet 将 GPX 和 KML 添加到我的地图,我使用 Leaflet 控件允许添加和删除图层。

我已经在干净的 joomla 开发安装中测试了控件,控件正常,如第一张图片所示 enter image description here

当我在我的 Joomla 站点中使用该组件时,che 控件不正常,有一些脏条目,如第二张图所示 enter image description here

我认为这是因为模板和一些脚本干扰了 Leaflet 但我无法修复它。 joomla 版本相同,模板没有,joomla 站点使用 gantry。 这是我用来填充地图的函数:

function showRouteTracks(tracce, baseURI, popup=false, enableLayers=true, enableElevation=false){
var layerControl = new Array();
for (var i = 0; i < tracce.length; i++) {

    var customLayer = L.geoJson(null, {
        style: getStyle(i)
    });

    if(tracce[i][3]=='GPX'){
        var layer = omnivore.gpx(baseURI+tracce[i][2], null, customLayer).on('ready', function() {
                elevation(enableElevation,layer);
            });
        if(popup){
            link='<a href="'+tracce[i][4]+'">'+tracce[i][5]+'</a>'
            layer.bindPopup(tracce[i][0]+"&#10141;"+tracce[i][1]+"<br/>"+link);
        }
        lvrtMap.addLayer(layer);
        layerControl[tracce[i][0]+"&#10141;"+tracce[i][1]]=layer;
    }
    if(tracce[i][3]=='KML'){
        var layer = omnivore.kml(baseURI+tracce[i][2], null, customLayer).on('ready', function() {
            elevation(enableElevation,layer);
        });
        if(popup){
            link='<a href="'+tracce[i][4]+'">'+tracce[i][5]+'</a>'
            layer.bindPopup(tracce[i][0]+"&#10141;"+tracce[i][1]+"<br/>"+link);
        }
        lvrtMap.addLayer(layer);
        layerControl[tracce[i][0]+"&#10141;"+tracce[i][1]]=layer;
    }
}

if(!enableLayers)
    layerControl=null;
if(enableElevation)
    L.control.layers(lvrtMapLayers,layerControl,{'position':'bottomright'}).addTo(lvrtMap);
else
    L.control.layers(lvrtMapLayers,layerControl).addTo(lvrtMap);

}

目前您正在创建一个数组来存储 title/layer 项:

var layerControl = new Array();

但是L.Control.Layers将对象文字作为baselayer/overlay参数:

var baseLayers = {
    "Mapbox": mapbox,
    "OpenStreetMap": osm
};

var overlays = {
    "Marker": marker,
    "Roads": roadsLayer
};

L.control.layers(baseLayers, overlays).addTo(map);

所以你应该使用对象字面量:

var layerControl = {};

您可以像以前一样添加项目:

layerControl['MyTitle'] = myLayerInstance;

我敢打赌你不会有问题的。现在发生的事情是您试图将字符串键分配给数组中的项目,这是不支持的(甚至应该可以工作,但除此之外)。 javascript 数组只能有数字键,不能有其他键。

它适用于全新安装而不适用于您的生产设置,可能是在生产中您加载了 javascript library/framework,它将 methods/properties 添加到 javascript 的本机数组原型,它们是可枚举的。因此,当 layercontrol 实例迭代数组时,它也会找到这些额外的 methods/properties 并尝试将它们添加到 layercontrol.

只需使用对象文字:{} 而不是 Array,你会没事的,祝你好运。

编辑:很好奇并进行了一些挖掘。事实证明这是由 Mootools 引起的,然后我 运行 进入这个问题:Looping through empty javascript array returns array object functions 给出了一些解释和其他一些解决方案,但最好只使用对象文字,因为此时你'有点滥用数组。