Очистка памяти при событиях мыши (компьютер тормозит) d3.js
Вот в чем вопрос. Есть мой код, стыренный у друзей c ru.stackoverflow.com. и доработанный мною.При событиях мыши он начинает тормозить чем больше действий ролика мыши тем больше. В чем проблема???
Вот мой код.
Внимание! Копируйте код себе в index.html файл, т.к. он не помещается в страницу
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v5.min.js"></script>
<style>
html,body{
overflow-y:hidden;
}
</style>
</head>
<body>
<script>
//W1="55,55 100,100 300,555 777,888"; Такой формат должен быть везде. или хъ[a,b,c,d,e,f,g,h]
var ddd=Math.floor((Date.now() - Date.parse(new Date().getFullYear(), 0, 0)) / 86400000);
//var S=ddd-1;
var S=244;
//var S=ddd-1;
var maxddd=366;
var R1=400.0;
var R2=340.0;
var R3=280.0;
var delta=450.0;
var p=(2*Math.PI)/366;
var x1 = [366+1];
var y1 = [366+1];
var x2 = [366+1];
var y2 = [366+1];
var x3 = [366+1];
var y3 = [366+1];
for(var i=0;i<=367;i++){
y1[i]=R1*(Math.sin(i*p))+delta;
x1[i]=R1*(Math.cos(i*p))+delta;
y2[i]=R2*(Math.sin(i*p))+delta;
x2[i]=R2*(Math.cos(i*p))+delta;
y3[i]=R3*(Math.sin(i*p))+delta;
x3[i]=R3*(Math.cos(i*p))+delta;
}
var canvas = d3.select("body")
.append("svg")
.attr("height", 1366)
.attr("width", 1024);
var polygon0=canvas.append("polygon")
for(var i=0;i<=maxddd-1;i++){
polygon0=canvas.append("polygon")
.attr("points", [x1[i],y1[i],x1[i+1],y1[i+1],x2[i+1],y2[i+1],x2[i],y2[i]])
.style("fill", "yellow")
.style("stroke", "black")
.style("strokeWidth", "1px")
}
var polygon1=canvas.append("polygon")
for(var i=0;i<=ddd-1;i++){
polygon1=canvas.append("polygon")
.attr("points", [x1[i],y1[i],x1[i+1],y1[i+1],x2[i+1],y2[i+1],x2[i],y2[i]])
.style("fill", "lightgreen")
.style("stroke", "black")
.style("strokeWidth", "1px")
}
var polygon2=canvas.append("polygon")
polygon=canvas.append("polygon")
.attr("points", [x1[S],y1[S],x1[S+1],y1[S+1],x2[S+1],y2[S+1],x2[S],y2[S]])
.style("fill", "blue")
.style("stroke", "black")
.style("strokeWidth", "1px")
window.addEventListener("wheel", function(ev) {
var dir = Math.sign(ev.deltaY);
if(dir==1){
S++;
}
else if(dir==-1){
S--;
}
for(var i=0;i<=maxddd-1;i++){
polygon0=canvas.append("polygon")
.attr("points", [x1[i],y1[i],x1[i+1],y1[i+1],x2[i+1],y2[i+1],x2[i],y2[i]])
.style("fill", "yellow")
.style("stroke", "black")
.style("strokeWidth", "1px")
}
for(var i=0;i<=ddd-1;i++){
polygon1=canvas.append("polygon")
.attr("points", [x1[i],y1[i],x1[i+1],y1[i+1],x2[i+1],y2[i+1],x2[i],y2[i]])
.style("fill", "lightgreen")
.style("stroke", "black")
.style("strokeWidth", "1px")
}
polygon2=canvas.append("polygon")
.attr("points", [x1[S],y1[S],x1[S+1],y1[S+1],x2[S+1],y2[S+1],x2[S],y2[S]])
.style("fill", "blue")
.style("stroke", "black")
.style("strokeWidth", "1px")
});
</script>
</body>
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
Проблема в том, что на каждую прокрутку, вместо перекраски одного элемента, на страницу добавляется заново нарисованные элементы
Для решения достаточно менять attrs у синего элемента
//W1="55,55 100,100 300,555 777,888"; Такой формат должен быть везде. или хъ[a,b,c,d,e,f,g,h]
var ddd = Math.floor((Date.now() - Date.parse(new Date().getFullYear(), 0, 0)) / 86400000);
//var S=ddd-1;
var S = 244;
//var S=ddd-1;
var maxddd = 366;
var R1 = 400.0;
var R2 = 340.0;
var R3 = 280.0;
var delta = 450.0;
var p = (2 * Math.PI) / 366;
var x1 = [366 + 1];
var y1 = [366 + 1];
var x2 = [366 + 1];
var y2 = [366 + 1];
var x3 = [366 + 1];
var y3 = [366 + 1];
for (var i = 0; i <= 367; i++) {
y1[i] = R1 * (Math.sin(i * p)) + delta;
x1[i] = R1 * (Math.cos(i * p)) + delta;
y2[i] = R2 * (Math.sin(i * p)) + delta;
x2[i] = R2 * (Math.cos(i * p)) + delta;
y3[i] = R3 * (Math.sin(i * p)) + delta;
x3[i] = R3 * (Math.cos(i * p)) + delta;
}
var canvas = d3.select("body")
.append("svg")
.attr("height", 1366)
.attr("width", 1024);
var polygon0 = canvas.append("polygon")
for (var i = 0; i <= maxddd - 1; i++) {
polygon0 = canvas.append("polygon")
.attr("points", [x1[i], y1[i], x1[i + 1], y1[i + 1], x2[i + 1], y2[i + 1], x2[i], y2[i]])
.style("fill", "yellow")
.style("stroke", "black")
.style("strokeWidth", "1px")
}
var polygon1 = canvas.append("polygon")
for (var i = 0; i <= ddd - 1; i++) {
polygon1 = canvas.append("polygon")
.attr("points", [x1[i], y1[i], x1[i + 1], y1[i + 1], x2[i + 1], y2[i + 1], x2[i], y2[i]])
.style("fill", "lightgreen")
.style("stroke", "black")
.style("strokeWidth", "1px")
}
var polygon2 = canvas.append("polygon")
polygon = canvas.append("polygon")
.attr("points", [x1[S], y1[S], x1[S + 1], y1[S + 1], x2[S + 1], y2[S + 1], x2[S], y2[S]])
.style("fill", "blue")
.style("stroke", "black")
.style("strokeWidth", "1px")
.classed("sss", true);
window.addEventListener("wheel", function(ev) {
var dir = Math.sign(ev.deltaY);
if (dir == 1) {
S++;
} else if (dir == -1) {
S--;
}
polygon2.attr("points", [x1[S], y1[S], x1[S + 1], y1[S + 1], x2[S + 1], y2[S + 1], x2[S], y2[S]])
});
html,
body {
overflow-y: hidden;
}
<script src="https://d3js.org/d3.v5.min.js"></script>