几个非常有用的links:
[1] three little circles. http://bost.ocks.org/mike/circles/
[2] How selection works. http://bost.ocks.org/mike/selection/
[3] Thinking with join. http://bost.ocks.org/mike/join/
具体而言,data()是用来将DOM element与数据进行绑定起来,其第二个参数可以用来specify当前的每个数据元素绑定到哪个DOM element上;
enter()是用来指代在对数据进行更新后,相对原有的数据来说,新增加的还没有绑定DOM element的数据;
exit()用来指代在对数据进行更新后,新数据中没有但是原来的数据中存在并且绑定了DOM element的数据 对应的DOM element。
如下是本人写的一个测试验证代码,可以直接运行查看打印结果进行分析,相关注释是对关键点的一些解释。
<html>
<head>
<title>D3 Axis Example</title>
<script src="http://d3js.org/d3.v2.js"></script>
</head> <body>
<div id = "svgContainer"></div>
<script>
var svgContainer = d3.select("body")
.select("#svgContainer")
.append("svg")
.attr("width", 500)
.attr("height", 500); //data 1
var dataArray1 = [4, 10, 20];
var circle = svgContainer.selectAll("circle")
.data(dataArray1);
console.log("circle: ",circle); var circleEnter = circle.enter()//.append("circle");
console.log("circleEnter",circleEnter); var circleEnterAppend = circle.enter().append("circle")
.attr("cx", function(d,i){
return i*100 + 30;
})
.attr("cy", 200)
.attr("r", function(d){
return d;
})
.attr("fill","steelblue");
console.log("circleEnterAppend",circleEnterAppend); //data 2
var dataArray2 = [20, 30, 40, 50];
var circle2 = svgContainer.selectAll("circle")
.data(dataArray2); //注意!这里没有加key function来区分哪个数据绑定到哪个元素,
//故[20, 30, 40]被默认按照顺序绑定到原来[4, 10, 20]对应的元素
console.log("circle2: ",circle2); console.log("update: ", circle2.data());//the update set,原来数据和现在数据都有的部分 //如果要改变原有的UI element的attribute,
//可以在此处直接操作circle2 (因为circle2选定的是所有的原来的circle,而此时新加的数据50还没有被append一个DOM element) var circleEnter2 = circle2.enter()//包含的将是新增加的数据,即:50
console.log("circleEnter2",circleEnter2); var circleEnterAppend2 = circleEnter2.append("circle")
.attr("cx",function(d,i){
return i*100 + 30;
})
.attr("cy", 200)
.attr("r",function(d){
return d;
})
.attr("fill","red");
console.log("circleEnterAppend2",circleEnterAppend2); //data 3
var dataArray3 = [ 30, 40, 50];
var circle3 = svgContainer.selectAll("circle")
.data(dataArray3,function(d){ //注意! key function is added!
return d;
});
console.log("circle3: ",circle3); console.log("exit: ", circle3.exit()); //打印的将是没有绑定数据的DOM element,即:20对应的DOM element console.log("update: ", circle3.data());//the update set // circle3.exit()
// .transition()
// .duration(200)
// .remove(); </script> </body>
</html>