Ответ 1
Ошибка заключается в том, что вы выбираете объекты данных (d.source и d.target), а не элементы DOM, связанные с этими объектами данных.
У вас есть подсветка строки, но я бы, вероятно, объединил ваш код в одну итерацию, например:
link.style("opacity", function(o) {
return o.source === d || o.target === d ? 1 : opacity;
});
Выделение соседних узлов сложнее, потому что вам нужно знать соседей для каждого node. Эта информация не так легко определить с помощью ваших текущих структур данных, так как все, что у вас есть в виде массива узлов и массива ссылок. Забудьте DOM на секунду и спросите себя, как вы определяете, являются ли два узла a
и b
соседями?
function neighboring(a, b) {
// ???
}
Дорогой способ сделать это - перебрать все ссылки и посмотреть, есть ли связь, соединяющая a и b:
function neighboring(a, b) {
return links.some(function(d) {
return (d.source === a && d.target === b)
|| (d.source === b && d.target === a);
});
}
(Предполагается, что ссылки неориентированы. Если вы хотите выделить только соседей с прямым соединением, то удалите вторую половину элемента OR.)
Более эффективный способ вычислить это, если вам нужно делать это часто, - это иметь карту или матрицу, которая позволяет искать постоянный поиск для проверки того, являются ли a и b соседями. Например:
var linkedByIndex = {};
links.forEach(function(d) {
linkedByIndex[d.source.index + "," + d.target.index] = 1;
});
Теперь вы можете сказать:
function neighboring(a, b) {
return linkedByIndex[a.index + "," + b.index];
}
И, таким образом, вы можете теперь перебирать узлы и правильно обновлять их непрозрачность:
node.style("opacity", function(o) {
return neighboring(d, o) ? 1 : opacity;
});
(Вы также можете воспользоваться специальным случаем самой привязанной по ссылке ссылкой, либо установив собственную ссылку для каждого node в linkedByIndex
, либо путем тестирования для d
непосредственно при вычислении стиля или с помощью a! important css :hover
.)
Последнее, что я изменил бы в вашем коде, это использовать непрозрачность и непрозрачность штриха, а не непрозрачность, потому что они предлагают гораздо лучшую производительность.