У меня есть диаграмма Google Geo со странами мира, и я пытаюсь удалить цвет обводки, когда пользователь наводит курсор на страну. Цвет обводки по умолчанию серый и я нашел как заменить цвет края страны, но для события наведения ничего не пишет в документации.
Как теперь выглядит цвет обводки при наведении:
https://imgur.com/AJXbmQ9 — серая обводка для активных стран
https://imgur.com/SyWQF1Q - Белая обводка для неактивных стран
var data = new google.visualization.DataTable();
data.addColumn('string', 'Country');
data.addColumn('number', 'Popularity');
data.addColumn({ type: 'string', role: 'tooltip' });
data.addRows(countriesData);
var options = {
sizeAxis: {
minValue: 0,
maxSize: 100
},
colorAxis: {
colors: colors
},
legend: 'none',
backgroundColor: 'transparent',
datalessRegionColor: 'transparent',
keepAspectRatio: true,
tooltip: {
isHtml: true
}
};
var chart = new google.visualization.GeoChart(document.getElementById('map'));
chart.draw(data, options);
google.visualization.events.addListener(chart, 'ready', function () {
var countries = document.getElementById('map').getElementsByTagName('path');
Array.prototype.forEach.call(countries, function (path) {
path.setAttribute('stroke', '#d2b9df');
});
});
как вы обнаружили, стандартного параметра конфигурации нет.
когда страна становится активной, для этой страны добавляются новые элементы <path>
.
мы можем использовать MutationObserver
, чтобы узнать, когда были добавлены новые элементы.
аналогично вашей функции по изменению цвета обводки для неактивных стран,
мы используем MutationObserver
, чтобы изменить цвет обводки для активных стран.
MutationObserver
даст нам добавленные элементы,
нам просто нужно покопаться, чтобы найти настоящие <path>
элементы.
// change active stroke color, build mutation observer
var observer = new MutationObserver(function (nodes) {
Array.prototype.forEach.call(nodes, function(node) {
// check for new nodes
if (node.addedNodes.length > 0) {
Array.prototype.forEach.call(node.addedNodes, function(addedNode) {
// the tooltip element will also be here, we only want the group elements
if (addedNode.tagName === 'g') {
// find children of the group element
Array.prototype.forEach.call(addedNode.childNodes, function(childNode) {
// check for path element, change stroke
if (childNode.tagName === 'path') {
childNode.setAttribute('stroke', '#ff0000');
}
});
}
});
}
});
});
// activate mutation observer
observer.observe(container, {
childList: true,
subtree: true
});
см. следующий рабочий фрагмент...
google.charts.load('current', {
packages: ['geochart'],
mapsApiKey: 'AIzaSyD-9tSrke72PouQMnMX-a7eZSW0jkFMBWY'
}).then(function () {
var data = google.visualization.arrayToDataTable([
['Country', 'value'],
['United States', 1],
['Canada', 1],
]);
var options = {
sizeAxis: {
minValue: 0,
maxSize: 100
},
colorAxis: {
colors: ['#8a4cab', '#8a4cab']
},
legend: 'none',
backgroundColor: 'transparent',
datalessRegionColor: 'transparent',
keepAspectRatio: true,
tooltip: {
isHtml: true
}
};
var container = document.getElementById('map');
var chart = new google.visualization.GeoChart(container);
google.visualization.events.addListener(chart, 'ready', function () {
// change inactive stroke color
var countries = container.getElementsByTagName('path');
Array.prototype.forEach.call(countries, function (path) {
path.setAttribute('stroke', '#d2b9df');
});
// change active stroke color, build mutation observer
var observer = new MutationObserver(function (nodes) {
Array.prototype.forEach.call(nodes, function(node) {
// check for new nodes
if (node.addedNodes.length > 0) {
Array.prototype.forEach.call(node.addedNodes, function(addedNode) {
// the tooltip element will also be here, we only want the group elements
if (addedNode.tagName === 'g') {
// find children of the group element
Array.prototype.forEach.call(addedNode.childNodes, function(childNode) {
// check for path element, change stroke
if (childNode.tagName === 'path') {
childNode.setAttribute('stroke', '#ff0000');
}
});
}
});
}
});
});
// activate mutation observer
observer.observe(container, {
childList: true,
subtree: true
});
});
chart.draw(data, options);
});
<script src = "https://www.gstatic.com/charts/loader.js"></script>
<div id = "map"></div>
РЕДАКТИРОВАТЬ
когда он становится активным, добавляются два элемента пути,
один с черной обводкой и шириной 3,
и еще один с цветом выделения и шириной 1.
проверьте атрибут штриха и удалите черный узел...
// check for path element, remove shadow, change stroke
if (childNode.tagName === 'path') {
if (childNode.getAttribute('stroke') === '#000000') {
addedNode.removeChild(childNode);
} else {
childNode.setAttribute('stroke', '#ff0000');
}
}
см. РЕДАКТИРОВАТЬ выше, у меня зрение не очень, я не мог заметить тень, но добавлены два элемента. либо удалите ту, что с черной обводкой, как в редактировании, либо измените черную обводку на прозрачную.
Круто, я использую его с childNode.setAttribute('stroke', 'transparent');
, если цвет обводки черный. Еще раз спасибо :)
У страны все еще есть тень, когда я навожу на нее курсор. Как я могу удалить это?