D3 - возврат строки таблицы в исходный bgcolor при наведении мыши

Извиняюсь за вопрос новичка, но я пытаюсь сделать следующее, используя d3:

1) отображать чередующиеся строки в сером и белом цветах (стиль зебра) 2) выделять строки при наведении мыши 3) возвращать строку в исходное состояние при наведении мыши

Я сделал это с помощью следующего кода, который прекрасно работает, за исключением того, что при наведении мыши строки возвращаются к исходному цвету. Вместо этого он просто отображает каждую строку как #c4c4c4 при наведении мыши

var rows = tbody.selectAll("tr")
    data(states)
    .enter()
    .append("tr")
    .style("background-color", function(d, i) {
       if (i%2===0){return "#fff";}else{return "#c4c4c4";}
      });


var rows = tbody.selectAll("tr")
     .on("mouseover", function(){
         d3.select(this).style("background-color", "yellow");})
     .on("mouseout", function(){
         d3.select(this).style("background-color", function(d,i) {
            if (i % 2 === 0){
               return "#fff";
             }
            else {
               return "#c4c4c4";
             }
        }
    )}

1 ответ

Проблема в том, что при повторном выборе this элемент, который становится выбором, из которого i Индекс определяется для внутренней (стиль) функции обратного вызова. Вы хотите i индекс из функции обработки события mouseout:

 .on("mouseout", function(d,i){ //correct index is passed here!

     d3.select(this).style("background-color", function(d2,j) {
                            //d2 will be the same as d, but j will always be 0
                            //since d3.select(this) only has one element
        if (i % 2 === 0){
           return "#fff";
         }
        else {
           return "#c4c4c4";
         }
    } )
 });

Вам не нужно объявлять параметры d2 а также j, поскольку они никогда не используются - я просто включил их для ясности.

Кстати, вы можете сделать оба этих эффекта с помощью CSS:

tr:nth-of-type(2n) { /* even rows */
  background-color: #c4c4c4;
}
tr:nth-of-type(2n+1) { /* odd rows */
  background-color: #fff;
}
tr:hover { /* mouseover */
  background-color: yellow;
}

Обратите внимание, что в CSS элементы нумеруются начиная с 1, поэтому первая строка считается нечетной.

Другие вопросы по тегам