而 onmousedown javascript
while onmousedown javascript
我正在绘制世界地图并尝试从绿色变为红色,这是按住鼠标时所点击的国家/地区的颜色。
我可以通过多次单击来更改颜色,但是当我尝试添加 while 循环时,它就冻结了。你能帮帮我吗?还有我怎样才能让颜色从绿色循环到红色?意思是一旦它变成红色并且我一直按住鼠标,它就会变成绿色等等......
Heres a fiddle for it
var color = d3.scale.linear().domain([0, 50]).range(["green", "red"]);
var pas = [];
var ismousedown = -1;
country
.on("mousemove", function(d, i) {
var mouse = d3.mouse(svg.node()).map(function(d) {
return parseInt(d);
});
tooltip.classed("hidden", false)
.attr("style", "left:" + (mouse[0] + offsetL) + "px;top:" + (mouse[1] + offsetT) + "px")
.html(d.properties.name);
})
.on("mouseout", function(d, i) {
tooltip.classed("hidden", true);
})
.on("mouseup", function(d, i) {
ismousedown = 0;
})
.on("mouseout", function(d, i) {
tooltip.classed("hidden", true);
})
.on("mousedown", function(d, i) {
ismousedown = 1;
while (ismousedown == 1) {
if (pas[d.id]) {
pas[d.id]++;
} else {
pas[d.id] = 1;
}
d3.select(this)
.classed("active", false)
.style("fill", function(d, i) {
return color(pas[d.id]);
return d.properties.color;
});
}
});
您正在使用一个循环,在该循环中您之前设置了条件变量,因此它始终为“1”并卡住了。您根本不需要 mousedown 变量,因为您的代码已经 运行 处于 .on("mousedown")
状态。我还实现了一个有效的 while 循环。但是颜色变化如此之快,以至于您看不到变化的发生。
我建议:
.on("mousedown", function(d, i) {
var counter = 0;
var max_counter = 255;
while (counter < max_counter) {
if (pas[d.id]) {
pas[d.id]++;
} else {
pas[d.id] = 1;
}
d3.select(this)
.classed("active", false)
.style("fill", function(d, i) {
return color(pas[d.id]);
return d.properties.color; });
counter++;
}
});
我修改了您的解决方案以使用 setInterval()。这将自动 运行 每 N 毫秒执行一次函数。在本例中,当鼠标按下时,颜色更新代码将每 10 毫秒 运行(您可以在 mousedown 函数中调整)。当鼠标松开时,间隔被清除,不再是运行s.
Updated JSFiddle(注意:我还在函数的顶部添加了一些变量)
.on("mousedown", function(d,i) {
var that = this;
ismousedown = true;
colorInterval = window.setInterval(function () {
// ...
}, 10); // <== runs every 10 milliseconds
})
.on("mouseup", function(d,i) {
window.clearInterval(colorInterval);
});
我正在绘制世界地图并尝试从绿色变为红色,这是按住鼠标时所点击的国家/地区的颜色。 我可以通过多次单击来更改颜色,但是当我尝试添加 while 循环时,它就冻结了。你能帮帮我吗?还有我怎样才能让颜色从绿色循环到红色?意思是一旦它变成红色并且我一直按住鼠标,它就会变成绿色等等...... Heres a fiddle for it
var color = d3.scale.linear().domain([0, 50]).range(["green", "red"]);
var pas = [];
var ismousedown = -1;
country
.on("mousemove", function(d, i) {
var mouse = d3.mouse(svg.node()).map(function(d) {
return parseInt(d);
});
tooltip.classed("hidden", false)
.attr("style", "left:" + (mouse[0] + offsetL) + "px;top:" + (mouse[1] + offsetT) + "px")
.html(d.properties.name);
})
.on("mouseout", function(d, i) {
tooltip.classed("hidden", true);
})
.on("mouseup", function(d, i) {
ismousedown = 0;
})
.on("mouseout", function(d, i) {
tooltip.classed("hidden", true);
})
.on("mousedown", function(d, i) {
ismousedown = 1;
while (ismousedown == 1) {
if (pas[d.id]) {
pas[d.id]++;
} else {
pas[d.id] = 1;
}
d3.select(this)
.classed("active", false)
.style("fill", function(d, i) {
return color(pas[d.id]);
return d.properties.color;
});
}
});
您正在使用一个循环,在该循环中您之前设置了条件变量,因此它始终为“1”并卡住了。您根本不需要 mousedown 变量,因为您的代码已经 运行 处于 .on("mousedown")
状态。我还实现了一个有效的 while 循环。但是颜色变化如此之快,以至于您看不到变化的发生。
我建议:
.on("mousedown", function(d, i) {
var counter = 0;
var max_counter = 255;
while (counter < max_counter) {
if (pas[d.id]) {
pas[d.id]++;
} else {
pas[d.id] = 1;
}
d3.select(this)
.classed("active", false)
.style("fill", function(d, i) {
return color(pas[d.id]);
return d.properties.color; });
counter++;
}
});
我修改了您的解决方案以使用 setInterval()。这将自动 运行 每 N 毫秒执行一次函数。在本例中,当鼠标按下时,颜色更新代码将每 10 毫秒 运行(您可以在 mousedown 函数中调整)。当鼠标松开时,间隔被清除,不再是运行s.
Updated JSFiddle(注意:我还在函数的顶部添加了一些变量)
.on("mousedown", function(d,i) {
var that = this;
ismousedown = true;
colorInterval = window.setInterval(function () {
// ...
}, 10); // <== runs every 10 milliseconds
})
.on("mouseup", function(d,i) {
window.clearInterval(colorInterval);
});