选择集/selection是d3中的核心对象,用来封装一组从当前HTML文档中选中的元素:node
d3提供了两个方法用来建立selection对象:框架
select()方法用来建立最多只包含一个DOM元素的选择集。若是当前文档中 没有匹配的元素,则创建一个空选择集;若是当前文档中有多个匹配的元素, 也只用第一个匹配元素创建选择集。dom
有两种方法调用select():函数
最经常使用的调用方法是传入一个CSS3选择符字符串:this
有时咱们须要将一个DOM对象转化为一个选择集对象,这时能够直接向select() 方法传入这个DOM对象:spa
一种常见的应用场景是在事件回调函数中,将this转化成选择集对象: d3.select(this),由于这时this指向触发事件的DOM元素。3d
selectAll()方法用来建立可包含多个DOM元素的选择集。若是当前文档中 没有匹配的元素,则创建一个空选择集;若是当前文档中有多个匹配的元素, 则使用全部匹配元素创建选择集。对象
和select()方法同样,也有两种方式调用selectAll()方法:blog
最经常使用的调用方法是传入一个CSS3选择符字符串:接口
若是已经得到了一组DOM对象,能够直接将其转化为选择集对象:
好比,在事件回调函数中,使用d3.select(this.childNodes)建立选择集。
d3定义选择集对象的一个目的是封装对DOM的操做。选择集提供了众多的方法(d3称之为 操做符/operator)来进行DOM操做,好比设置属性、样式、文本内容以及监听 DOM事件等。从这个角度看,d3的选择集对象相似于jQuery中的$对象,若是你 从jQuery过来,应该容易理解这一点:
有趣的是,d3的选择集对象和jQuery对象同样,也具备链式调用的能力。绝大多数的选择 集操做符返回的结果仍是一个选择集(可能和最初的选择集内容不同),这使得调用能够持续下去, 像一条流水线:
容易理解,选择集是d3中文档处理流水线的开端,选择集的操做符就是流水线中的各个 处理环节,当选择集流过流水线,原始文档的修改就天然而然地发生了。
d3定义选择集对象的更深层次的目的是封装数据驱动能力。经过data() 操做符,d3使数据化可视化工做者可以以一种声明式的方式指定处理流水线,从而 简化从数据到文档的处理过程:
和style()这样的操做符不一样,data()操做符可以改变选择集的内容。 当选择集流过style()环节后,选择集的内容并没有变化,变化的是选择集中 各个DOM对象的属性。然而,当一个选择集流过data()环节后,将得到一个不一样的选择集: 所包含的DOM对象发生了变化。
each()方法容许咱们定制对选择集中DOM元素的处理行为:
参数func是调用者定义的函数,在d3中被称为访问器/accessor。 d3将对选择集中的每个DOM对象,依次调用该访问器函数。
在调用访问器函数时,d3会将this指向当前要处理的DOM对象, 并传入两个参数:
能够认为访问器是d3流水线中每一个处理环节用户逻辑的封装接口,d3经过这个接口, 实现了流水线框架和用户处理逻辑的解耦:
几乎全部的操做符在内部实现中都使用了each(),每当d3提供的操做符 不能知足你的需求时,都不妨试一试each()。