传单控制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]+"➝"+tracce[i][1]+"<br/>"+link);
}
lvrtMap.addLayer(layer);
layerControl[tracce[i][0]+"➝"+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]+"➝"+tracce[i][1]+"<br/>"+link);
}
lvrtMap.addLayer(layer);
layerControl[tracce[i][0]+"➝"+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 给出了一些解释和其他一些解决方案,但最好只使用对象文字,因为此时你'有点滥用数组。
我已经创建了一个 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]+"➝"+tracce[i][1]+"<br/>"+link);
}
lvrtMap.addLayer(layer);
layerControl[tracce[i][0]+"➝"+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]+"➝"+tracce[i][1]+"<br/>"+link);
}
lvrtMap.addLayer(layer);
layerControl[tracce[i][0]+"➝"+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 给出了一些解释和其他一些解决方案,但最好只使用对象文字,因为此时你'有点滥用数组。