Есть несколько небольших проблем с вашим кодом. Тот, который кусает вас прямо сейчас, заключается в том, что вы не очищаете тайм-аут BBB при входе в AAA. Вы можете исправить это, добавив обработчик clearTimeout
в обработчик mouseover
AAA.
Во-вторых, безопаснее очищать этот тип таймаута, прежде чем устанавливать его каждый раз, чтобы у вас не было тайм-аута отслеживание перезаписывается, если произойдет что-то неожиданное. (Всегда безопасно очищать тайм-аут, даже если он недействителен или уже произошел.)
Наконец, хотя это скорее всего проблема только в вашем примере кода, вы пропускаете time
в глобальный объект. ; -)
Попробуйте это вместо:
$(document).ready(function() {
var time;
function show() {
$("BBB").css({'display':'block'});
}
$("AAA").each(function() {
$(this).mouseover(function() {
clearTimeout(time);
show();
});
$(this).mouseleave(function() {
clearTimeout(time);
time = setTimeout("hide()", 200);
});
$("BBB").mouseleave(function() {
clearTimeout(time);
time = setTimeout("hide()", 200);
});
$("BBB").mouseenter(function() {
clearTimeout(time);
});
});
});
function hide() {
$("BBB").css({'display':'none'});
}
Причина в том, что те комбинации года / статуса, которые должны были бы создавать записи с values: 0
, не существуют в исходных данных. d3 только повторяет существующих комбинаций ...
Таким образом, вам придется заполнить пробелы своим собственным кодом. Это можно сделать разными способами. Один из них состоит в цепочке .map
, которая добавляет пропущенную запись values
при необходимости:
d3.csv("https://raw.githubusercontent.com/benubah/rconsortium_projects/master/test.csv")
.then(function(data) {
var stat = d3.nest()
.key(d => d.Year)
.key(d => d.Status)
.rollup(v => v.length)
.entries(data)
.map(function (obj) {
if (obj.values.length === 1) {
if (obj.values[0].key == "Completed") {
obj.values.unshift({ key: "InProgress", values: 0 });
} else {
obj.values.push({ key: "Completed", values: 0 });
}
}
return obj;
});
console.log(stat);
});
<script src="https://d3js.org/d3.v5.js"></script>