d3.js--04(enter和exit)

enter()

当DOM数量少于data的数量,或者压根一个都没有的时候,我们一般会希望让程序帮忙创建。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>柱状图</title>
 6 </head>
 7 <body>
 8 
 9 <svg>
10     <rect></rect>
11     <rect></rect>
12 </svg>
13 <script src="d3.js"></script>
14 <script>
15 
16     var dataset = [250, 210, 170, 130, 90];  //数据(表示矩形的宽度)
17     var rectHight = 25;
18     var svg = d3.select('svg');
19     svg.attr('width', 300)
20         .attr('height', 300)
21         .attr('fill', 'red');
22     var rect = svg.selectAll('rect');
23 
24     //绑定数据后,分别获取update和enter部分
25     var update = rect.data(dataset);
26     var enter = update.enter();
27 
28     //update部分的处理方法是直接修改内容
29 
30     update.attr('x', 20)
31         .attr('y', function (d, i) {
32             return i * rectHight;
33         })
34         .attr('width', function (d) {
35             return d;
36         })
37         .attr('height', rectHight - 2);
38 
39     //enter部分的处理方法是添加元素后再修改内容
40     enter.append('rect')
41         .attr('x', 20)
42         .attr('y', function (d, i) {
43             return i * rectHight;
44         })
45         .attr('width', function (d) {
46             return d;
47         })
48         .attr('height', rectHight - 2);
49 
50 
51 </script>
52 
53 
54 </body>
55 </html>

通常,从服务器读取文件后,数据是有的,但是网页中是没有元素的。这是D3一个很重要的特性,即可以选择一个空集,然后使用enter().append()的形式来插入元素。假设现在body里没有p元素,请看如下代码

1 var dataset = [10,20,30,40,50]; 
2 var body = d3.select("body"); 
3 body.selectAll("p") //选择body中所有p,但由于没有p,所以选择了一个空集 
4  .data(dataset)  //绑定dataset数组 
5  .enter()   //返回enter部分 
6  .append("p")  //添加p元素 
7  .text(function(d){ return d; });

exit()

与enter()相反,exit()是用来选择那些与数据相比多出来的DOM元素。

在下面例子中,我们多提供了一个DOM元素:

1 <body>
2  <p></p>
3  <p></p>
4  <p></p>
5  <p></p>
6 </body>

这回就容易理解了,因为是多出来的,那么就是实际存在的,即最后一个<p>。

多出来的话,我们可以接着用.remove()移除这些元素,代码如下:

1 d3.select("body").selectAll("p").data([1, 2, 3]).exit().remove();

exit的处理方法

有多出的元素,没有数据与之对应。对于这样的元素,通常的做法是使用remove()删除元素。假设body中有5个p元素,请看如下代码:

1 var dataset = [10, 20, 30]; 
2  var p = d3.select("body").selectAll("p"); 
3 //绑定数据之后,分别获取update部分和exit部分 
4  var update = p.data(dataset); 
5  var exit = update.exit(); 
6 //update的部分的处理方法是修改内容 
7  update.text( function(d){ return d; } ); 
8 //exit部分的处理方法是删除 
9  exit.remove();

这段代码中,对于exit部分的处理方法是删除。删除之后,网页中将不会有多余的p元素。

原文地址:https://www.cnblogs.com/thelongmarch/p/6734406.html