为什么d3的select()和selectAll()在这里表现不同?

Jon*_*nah 10 javascript d3.js

我正在玩拖动倍数的例子,我注意到了一些我无法解释的事情.

在这个片段中:

var svg = d3.select("body").selectAll("svg")
    .data(d3.range(16).map(function() { return {x: width / 2, y: height / 2}; }))
    .enter().append("svg")
    .attr("width", width)
    .attr("height", height);
Run Code Online (Sandbox Code Playgroud)

我换selectAllselect.它仍然有效,但现在的svg元素将被添加</body>标签.原始代码,如您所期望的那样selectAll,将它们添加到<body>标记之后.

由于原来的HTML不包含硬编码的<svg>元素,我认为无论是selectselectAll刚刚返回空选择.所以我无法弄清楚为什么它们导致不同的行为.

我只是在寻找解释.谢谢!

Avi*_*bey 8

select和selectAll之间的基本区别在于,select会压缩现有选择的层次结构,而selectAll会保留它.

因此,当您在另一个之后使用一个selectAll时,结果将很像嵌套for循环列表.

http://bost.ocks.org/mike/nest/


Dav*_*ter 5

查看 Mike Bostock 的关于 select/selectAll: Nested Selections的帖子

报价:

select 和 selectAll 之间有一个重要的区别:select 保留现有的分组,而 selectAll 创建一个新的分组。因此,调用 select 会保留原始选择的数据、索引甚至父节点!