我正在使用D3 javascript库来动态更改线条粗细。我想要实现的是一条线,厚度增加,厚度逐渐减少。为了绘制一条线,我使用了以下代码:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://mbostock.github.com/d3/d3.js"></script>
</head>
<body>
<div id="D3line"></div>
<script type="text/javascript">
var lineSVG = d3.select("#D3line")
.append("svg:svg")
.attr("width", 500)
.attr("height", 200);
var myLine = lineSVG.append("svg:line")
.attr("x1", 60)
.attr("y1", 60)
.attr("x2", 450)
.attr("y2", 150)
.style("stroke", "rgb(6,120,155)")
.style("stroke-opacity", 2);
</script>
</body>
</html>
然后,为了改变线条笔划粗细,我使用了以下代码:
var lines = lineSVG.selectAll("line") // select all lines
function makeLinesThick()
{
lines.transition().duration(500)
.style("stroke-width", "5")
.each("end", makeLinesThin);
}
function makeLinesThin(){
lines.transition().duration(500)
.style("stroke-width", "2")
.each("end", makeLinesThick);
}
// call function to change lines
makeLinesThick()
但是,我最终没有正常运行并在浏览器中收到“无响应脚本”消息。在这种情况下,我不确定我是否正确构造回调。
修改:我删除了()
行中的.each()
,更改了错误的回调处理。
答案 0 :(得分:5)
问题在于,为您选择的每个元素调用.each("end", ...)
。也就是说,makeLinesThin
中的每一行都会调用makeLinesThick
一次。这就是导致浏览器挂起的原因。
有几种方法可以让它发挥作用。您可以更改代码以单独执行每行的转换(请参阅transition.each()
的文档),或者您可以使用settimeout()
分别计划所有行的转换。请特别注意transition.transition()
的文档 - 您可以在当前转换完成之前安排另一个转换。
您可能还想查看d3.timer()
,例如here。
答案 1 :(得分:0)
var mutateLine =
function(line, t, width, altWidth) {
d3.select(line).transition().duration(t).style("stroke-width", width)
.each("end", function() {
if ( mutateLine ) mutateLine(line, t, altWidth, width);
});
}
// assumes lines is obtained from d3.selectAll()
var mutateLines =
function(lines, t, width, altWidth) {
if ( !mutateLine)
return;
lines[0].forEach(function(line) {
mutateLine(line, t, width, altWidth);
}
};
// start mutating
mutateLines(lines, 500, 5, 2);
// stop mutating
mutateLine = null;
答案 2 :(得分:0)
使用.each(“start”)和.each(“end”)来设置转场