我正在尝试使用jVectorMap's库来绘制旁边有标签的不同标记。
我遇到的问题是标签下的render
函数,我尝试遍历数组并将其添加到名称中。不幸的是,它将解析后的HTML以文本形式放入标签,而不是HTML。
labels: {
markers: {
render: function(index) {
var markerStr = "";
markerStr += currentMarkers[index].name;
$.each(currentMarkers[index].divisions, function(index, currentDivision) {
markerStr += currentDivision + "<br>";
});
return $.parseHTML(markerStr);
},
offsets: function(index) {
return currentMarkers[index].offsets || [0, 0];
}
}
}
我有made a codepen example,以便您可以看到我正在谈论的内容。
不同的变量:
var allMarkers = [{
latLng: [43.831997, 11.204543],
name: 'Location A',
country: 'IT',
divisions: ["AAAAAAA", "BBBBBBBBB"]
}, {
latLng: [40.537014, -3.636961],
name: 'Location B',
country: 'ES',
divisions: ["R & D", "BBBBBBBBBB", "AAAAAAAA"]
}, {
latLng: [53.409245, -2.990841],
name: 'Location C',
country: 'GB',
divisions: ["BBBBBBBBB"]
}, {
latLng: [51.375644, -0.677483],
name: 'Location D',
country: 'GB',
offsets: [-4, -8],
divisions: ["CCCCCCCC"]
}, {
latLng: [51.266658, -1.093064],
name: 'Location E',
country: 'GB',
offsets: [-100, 5],
divisions: ["DDDDDDD"]
}, {
latLng: [51.196622, -0.393301],
name: 'Location F',
country: 'GB',
divisions: ["CCCCCC"]
}, {
latLng: [50.226984, 8.615192],
name: 'Location G',
country: 'DE',
divisions: ["DDDDDDDDD"]
}, {
latLng: [51.896741, -8.487941],
name: 'Location H',
country: 'IE',
offsets: [-3, -10],
divisions: ["FFFFFFFFFF", "EEEEEEEEEEE"]
}, {
latLng: [53.350129, -6.263215],
name: 'Location I',
country: 'IE',
offsets: [-60, 0],
divisions: ["EEEEEEEE"]
}, {
latLng: [51.706063, -8.522351],
name: 'Location J',
country: 'IE',
offsets: [-66, 2],
divisions: ["BBBBBBBBB"]
}, {
latLng: [48.884578, 2.269055],
name: 'Location K',
country: 'FR',
offsets: [0, -3],
divisions: ["GGGGGGGGG"]
}, {
latLng: [48.489941, 7.678864],
name: 'Location L',
country: 'FR',
divisions: ["HHHHHHHHH"]
}];
var currentMarkers = allMarkers.slice();
var highlightedCountries = ['GB', 'IT', 'ES', 'FR', 'DE', 'IE'];
代码:
var mapObj = new jvm.Map({
container: $('#map'),
map: 'europe_mill',
focusOn: {
x: 0.5,
y: 0.6,
scale: 2
},
markerStyle: {
initial: {
fill: '#fff',
stroke: '#383f47'
}
},
regionStyle: {
hover: {
"fill-opacity": .6,
}
},
onRegionTipShow: function(e, el, code) {
if (highlightedCountries.indexOf(code) > -1) {
$('.jvectormap-tip').removeClass('hidden');
} else {
$('path[data-code="' + code + '"]').attr('fill-opacity', 1).attr('cursor', 'default');
$('.jvectormap-tip').addClass('hidden');
}
},
backgroundColor: '#d0e7f7',
markers: currentMarkers,
series: {
regions: [{
values: {
GB: '#cecece',
IT: '#cecece',
ES: '#cecece',
FR: '#cecece',
DE: '#cecece',
IE: '#cecece'
}
}]
},
labels: {
markers: {
render: function(index) {
var markerStr = "";
markerStr += currentMarkers[index].name;
$.each(currentMarkers[index].divisions, function(index, currentDivision) {
markerStr += currentDivision + "<br>";
});
return $.parseHTML(markerStr);
},
offsets: function(index) {
return currentMarkers[index].offsets || [0, 0];
}
}
},
onMarkerTipShow: function(e, label, code) {
var labelStr = "";
$.each(currentMarkers[code].divisions, function(index, currentDivision) {
labelStr += currentDivision + "<br>";
});
label.html(labelStr);
},
zoomOnScroll: false
});
答案 0 :(得分:0)
好的,这是一个答案,它允许您使用tspans在标签中添加中断,这些内容可以包含在svgs中:
$(document).ready(function() {
变量:
var allMarkers = [{
latLng: [43.831997, 11.204543],
name: 'Location A',
country: 'IT',
divisions: ["AAAAAAA", "BBBBBBBBB"]
}, {
latLng: [40.537014, -3.636961],
name: 'Location B',
country: 'ES',
divisions: ["R & D", "BBBBBBBBBB", "AAAAAAAA"]
}, {
latLng: [53.409245, -2.990841],
name: 'Location C',
country: 'GB',
divisions: ["BBBBBBBBB"]
}, {
latLng: [51.375644, -0.677483],
name: 'Location D',
country: 'GB',
offsets: [-4, -8],
divisions: ["CCCCCCCC"]
}, {
latLng: [51.266658, -1.093064],
name: 'Location E',
country: 'GB',
offsets: [-100, 5],
divisions: ["DDDDDDD"]
}, {
latLng: [51.196622, -0.393301],
name: 'Location F',
country: 'GB',
divisions: ["CCCCCC"]
}, {
latLng: [50.226984, 8.615192],
name: 'Location G',
country: 'DE',
divisions: ["DDDDDDDDD"]
}, {
latLng: [51.896741, -8.487941],
name: 'Location H',
country: 'IE',
offsets: [-3, -10],
divisions: ["FFFFFFFFFF", "EEEEEEEEEEE"]
}, {
latLng: [53.350129, -6.263215],
name: 'Location I',
country: 'IE',
offsets: [-60, 0],
divisions: ["EEEEEEEE"]
}, {
latLng: [51.706063, -8.522351],
name: 'Location J',
country: 'IE',
offsets: [-66, 2],
divisions: ["BBBBBBBBB"]
}, {
latLng: [48.884578, 2.269055],
name: 'Location K',
country: 'FR',
offsets: [0, -3],
divisions: ["GGGGGGGGG"]
}, {
latLng: [48.489941, 7.678864],
name: 'Location L',
country: 'FR',
divisions: ["HHHHHHHHH"]
}];
var currentMarkers = allMarkers.slice();
var highlightedCountries = ['GB', 'IT', 'ES', 'FR', 'DE', 'IE'];
<强> CODE 强>
var mapObj = new jvm.Map({
container: $('#map'),
map: 'europe_mill',
focusOn: {
x: 0.5,
y: 0.6,
scale: 2
},
markerStyle: {
initial: {
fill: '#fff',
stroke: '#383f47'
}
},
regionStyle: {
hover: {
"fill-opacity": .6,
}
},
onRegionTipShow: function(e, el, code) {
if (highlightedCountries.indexOf(code) > -1) {
$('.jvectormap-tip').removeClass('hidden');
} else {
$('path[data-code="' + code + '"]').attr('fill-opacity', 1).attr('cursor', 'default');
$('.jvectormap-tip').addClass('hidden');
}
},
backgroundColor: '#d0e7f7',
markers: currentMarkers,
series: {
regions: [{
values: {
GB: '#cecece',
IT: '#cecece',
ES: '#cecece',
FR: '#cecece',
DE: '#cecece',
IE: '#cecece'
}
}]
},
labels: {
markers: {
render: function(index) {
var markerStr = "";
markerStr += '<tspan dy="0em">' + currentMarkers[index].name + "</tspan>";
$.each(currentMarkers[index].divisions, function(index, currentDivision) {
markerStr += '<tspan style="font-weight:100;font-style:italic;" dy="1.2em">' + currentDivision + "</tspan>";
});
nextTick(fixMarkers);
return markerStr;
},
offsets: function(index) {
return currentMarkers[index].offsets || [0, 0];
}
}
},
zoomOnScroll: false
});
$('#map').on('click', function(event) {
mapObj.removeAllMarkers();
currentMarkers = [];
resetCountryColors(highlightedCountries);
var countryCode = $(event.target).attr('data-code');
if (highlightedCountries.indexOf(countryCode) > -1) {
$(event.target).css('fill', '#d52b1e');
for (var i = 0; i < allMarkers.length; i++) {
if (countryCode == allMarkers[i].country) {
currentMarkers.push(allMarkers[i]);
}
}
mapObj.addMarkers(currentMarkers, []);
}
mapObj.updateSize();
});
$(window).resize(function() {
mapObj.updateSize();
fixMarkers();
});
$('.jvectormap-container').mousemove(fixMarkers).swipe({
swipeStatus: fixMarkers
});
});
function resetCountryColors(chosenCountries) {
$.each(chosenCountries, function(index, currentCountry) {
$('.jvectormap-element[data-code="' + currentCountry + '"]').css('fill', '#cecece');
});
}
function fixMarkers() {
$('text.jvectormap-marker').each(function() {
var $this = $(this);
var text = $this.text();
if (text.indexOf('</tspan>') !== -1) {
$this.html(text);
}
$this.find('tspan').each(function() {
$(this).attr('x', $this.attr('x'));
});
});
}
function nextTick(cb) {
if (typeof window.Promise === 'function') {
Promise.resolve().then(cb);
} else if (typeof window.setImmediate === 'function') {
setImmediate(cb);
} else {
setTimeout(cb, 0);
}
}
特别注意以下代码,它将tspans
放入代码
markerStr += '<tspan dy="0em">' + currentMarkers[index].name + "</tspan>";
$.each(currentMarkers[index].divisions, function(index, currentDivision) {
markerStr += '<tspan style="font-weight:100;font-style:italic;" dy="1.2em">' + currentDivision + "</tspan>";
});
nextTick(fixMarkers);
return markerStr;
和fixMarkers
函数,它将tspans
转换为HTML。
<强> HERE IS A WORKING EXAMPLE 强>
答案 1 :(得分:0)
找到一个简单的方法:
onMarkerLabelShow: function(event, label, code) {
var mySplitResult = label.html().split("\r\n");
label.html("");
for(i = 0; i < mySplitResult.length; i++){
if (i == mySplitResult.length-1){label.html( label.html() + mySplitResult[i]); } else{label.html( label.html() + mySplitResult[i] + "<br />"); }
}
}