У меня есть пользовательские стили в легендах Highcharts, которые отлично работают. Когда я нажимаю элемент, я хочу применить другой стиль, чтобы отобразить отключение кнопки. Для этого я использовал счетчик, т.е. Когда счетчик ровный, должен применяться активный стиль, а нечетный счетчик должен использоваться нечетным. Это не работает должным образом, я думаю, проблема связана с областями. Вы найдете следующий код:
var clickCounter = 0;
Highcharts.chart('container', {
plotOptions: {
series: {
events: {
legendItemClick: function () {
clickCounter++;
return clickCounter;
}
},
showInLegend: true
}
},
legend: {
useHTML: true,
labelFormatter: function (clickCounter) {
if(clickCounter%2 == 0)
return '<span class="span-legend-active">' + this.name + '</span>'
else
return '<span class="span-legend-item-inactive">' + this.name + '</span>'
}
},
xAxis: {
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
},
series: [{
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}, {
data: [11.9, 31.5, 78.4, 29.2, 44.0, 76.0, 95.6, 48.5, 116.4, 114.1, 35.6, 154.4]
}]
});
.span-legend-active {
background-color: white;
border: 1px solid green;
/* border: none; */
color: black;
padding: 3px 7px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 13px;
}
.span-legend-item-inactive {
background-color: white;
border: 1px solid #cccccc;
color: #cccccc;
padding: 3px 7px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 13px;
}
<script src="https://code.highcharts.com/highcharts.js"></script>
<div id="container" style="height: 400px"></div>
Любая помощь приветствуется
Я думаю, вам не нужно использовать событие legendItemClick для этого. Вы можете попытаться изменить свои селектор CSS с помощью:
.highcharts-legend-item > span > span {
(active style)
}
.highcharts-legend-item-hidden > span > span {
(inactive style)
}
Ваш измененный код здесь.
РЕДАКТИРОВАТЬ:
Я сделал jsfiddle для переключения CSS ваших предметов легенды.
Вы можете установить класс в свою легенду, щелкнув вот так,
events: {
legendItemClick: function(event) {
//console.log(event);
if(this.visible)
event.target.legendItem.element.firstChild.className = 'span-legend-item-inactive';
else
event.target.legendItem.element.firstChild.className = 'span-legend-active';
}
}
Здесь this.visible
является логической переменной, заданной Hightcharts, для обозначения видимости легенды или нет. Проверьте jsfiddle ссылки с сайта Highcharts.
Если он отображается во время onclick
, вы можете назначить свой .span-legend-item-inactive
класс, чтобы он был отключен. Аналогично, если он не отображается во время onclick
, вы можете назначить .span-legend-active
чтобы он выглядел включенным. Вы можете предоставить имена разделенных пространствами, если вы хотите назначить несколько классов или использовать event.target.legendItem.element.firstChild.classList
Кроме того, Highcharts передает event
объекта к этим функциям событий. Вы можете отключить его и проверить методы или переменные, которые вы можете использовать для своей цели.
Кроме того, this.color
даст текущий цвет строки строки. Таким образом, вы можете использовать это, чтобы установить цвет легенды или цвет границы в labelFormatter
с чем-то вроде этого,
return '<span class="span-legend-active" style="border-color:${this.color}">${this.name}</span>'
Ссылка на jsfiddle.
Старый ответ:
Функция labelFormatter() не предоставляет никаких аргументов для функции, поэтому clickCounter undefined.
Поэтому не давайте clickCounter вашей функции labelFormatter, она будет взята из глобальной области.
legend: {
useHTML: true,
labelFormatter: function () {}
}