Я работаю над визуализацией карты мира, используя Javascript и D3.js. При нажатии на страну все другие страны получают класс inactiveCountry
, который добавляет opacity: 0.3
, который выделяет выбранную страну. Я хотел бы, чтобы при повторном нажатии на выделенную страну все другие страны теряли класс inactiveCountry
, поэтому у них снова появляется opacity: 1
.
Это карта:

При выборе страны:

Ниже приведен код, который рисует и раскрашивает карту:
g.selectAll("path").data(countries.features)
.enter().append("path")
.attr("d", pathGenerator)
.attr("class", "country")
.attr("id", function (d){
return d.properties.name
})
.attr("fill", function (d) {
return colorScaleWorldmap(colorValue(d))
})
.on("click", function (d) {
changeCountry(d.properties.name);
})
.append("title")
.text(function (d) {
return d.properties.name + ": " + colorValue(d);
});
Как видите, при нажатии на страну запускается функция changeCountry();
, а именно:
function changeCountry(countryName) {
country = countryName;
console.log(country);
let totalCountries = document.getElementsByClassName("country");
// Remove class countryActive from previous selection
for (let i = 0; i < totalCountries.length; i++) {
if (totalCountries[i].classList.contains("countryActive")) {
totalCountries[i].classList.replace("countryActive", "countryInactive")
}
}
// Add class countryActive to selected country
let element = document.getElementById(country);
element.classList.add("countryActive");
for (let i = 0; i < totalCountries.length; i++) {
if (totalCountries[i].classList.contains("countryActive")) {
totalCountries[i].classList.remove("countryInactive")
} else {
totalCountries[i].classList.add("countryInactive")
}
}
}
Как бы я добавил добавление взаимодействия, когда при нажатии на выбранную страну снова все страны становятся видимыми (таким образом теряется класс countryInactive
)? Я попытался использовать комбинацию JQuery .click
и .data
как таковую:
$("#" + country).click(function(){
$(this).data('clicked', true);
});
if($("#" + country).data('clicked')) {
alert('yes');
}
Проблема с этим фрагментом кода состоит в том, что после того, как я хотя бы один раз щелкнул по стране, он, похоже, сохраняет оператор true
, поэтому даже когда я нажимаю на него, когда он неактивен, я получаю предупреждение yes
.