- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好,我有一个关于 d3 的性质的问题,我认为这是关于 d3 的非常深入的细节。
据我了解,
d3 中的变量声明,如
var svg = d3.select('boby').append('svg')
意味着,
"I'm going to select 'body' and append 'svg'. and store this as a variable called 'svg'."
代替
"variable svg is 'to select body and append svg"
我之所以这样想是因为
如果第二种解释正确,
每次我输入 svg,它都会附加 svg。
所以我认为我的第一个解释是正确的。
但是,
如果是这样的话下面的代码应该可以工作。
var area = svg.append('g')
area.append('path')
area.attr('d').data(somedata)
因为,我添加了“g”
然后将其存储为名为“area”的变量
然后在那里附加“路径”
然后在那里添加了属性
然后为此绑定(bind)了一些数据。
但是,它没有成功。
当时我尝试的是,
贴标另一个变量并在该新变量之后添加附加条件,例如
var uarea = area.append('path')
uarea.attr('d').data(somedata)
结果很完美。
为什么我的第一种方法行不通,而最后一种方法行得通。我认为这个问题更多的是关于 d3 中幕后发生的事情。我希望有人能给我一些 d3 的启蒙罢工。
最佳答案
我不确定我是否正确理解了您的问题。但我会尝试在这里提供答案。
简短的回答是:不,您正在测试的假设是不正确的,因为它假设 .append()
修改了现有的选择。 area
仍然是 g
的选择,无论您将什么附加到 area
。
由于您关于附加 SVG
的第一个假设,我将从头开始。
D3 选择方法经常可链接,因为它们经常用于返回选择。通过返回选择,可以对返回值使用另一种选择方法,从而允许链接。
但是选择方法返回的选择并不总是相同元素的选择——也就是说它可能是不同的选择。
如果使用 .style()
、.attr()
、.each()
、.call()
, .on()
, .raise()
, .html()
, .text()
> 等方法设置属性、样式等,返回值是原始选择本身。通常可用于返回当前选择的方法是那些修改有关选择的某些内容的方法。 如果不设置值,这些方法中的许多方法可用于返回值而不是选择。
如果使用诸如 .append()
、.enter()
、.exit()
、.merge 之类的方法()
, .filter()
, .select()
, .selectAll()
等返回值是一个不同的选择。
当使用链来定义变量时,分配的值是链中最后一项的返回值。
最后,无法更改 D3 选择:
Selections are immutable. All selection methods that affect which elements are selected (or their order) return a new selection rather than modifying the current selection. (source)
一旦我们将选择定义为由某些元素组成,我们就无法更改它。我们只能重新定义具有不同选择的变量。
D3v3 在这方面略有不同,但不是为了您的问题
现在,看看您对这条线的初步评估:
var svg = d3.select('body').append('svg')
还有你的解释:
I'm going to select [the] 'body' and append [a] 'svg'. and store this as a variable called
svg
.
您的解释是正确的,让我们打破链接并使用两个变量来实现相同的事情以查看您正在使用的两个选择:
var body = d3.select("body") // returns a selection of the body
var svg = body.append("svg") // returns a selection of a newly created svg
body
仍然是主体的选择 - 将内容附加到 body
不会改变 body
是主体的选择。然后我们使用 svg
来存储新的选择:新添加的 SVG 的选择。稍后将任何项目附加到 svg
都不会改变 svg
成为 svg
的选择。
应用以上所有内容,我们可以看到一种方法,例如:
var area = svg.append('g') // returns a selection of a new g element, stored as `area`
area.append('path') // returns a selection of a new created path element, but you don't store this reference, nothing is done with it.
area.attr('d', somePathData) // attempting to modify a g element instead of a path.
这不会像您预期的那样工作,area
仍然是 g
元素的选择:您这样定义它并且没有重新定义 area
进行一些不同的选择。 .append()
创建一个新的选择 - 除了创建路径之外您不会使用的选择。
如您所述,如果我们将 path
选择存储在一个新变量中,代码将按预期工作:
var area = svg.append('g') // returns a selection of a new g element
var path = area.append('path') // returns a selection of a new path element
path.attr('d', somePathData) // modifies a path element
最后,如果我们永远不需要再次修改路径,我们就不需要使用变量来存储它,我们可以这样做:
var area = svg.append('g') // returns a selection of a new g element
area.append('path') // returns a selection of a new path element
.attr('d', somePathData) // modifies the selection of the path element
关于javascript - d3(幕后)-area.style.append 有效,而 area.style + area.append 无效。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61072182/
Racket 的 pict , 有几个 combinators for combining other pictures .这些文档包含一个很好的表格,说明其 *-append 组合器的工作方式: 这
我看过 Insert content into iFrame和他们的 fiddle http://jsfiddle.net/8VP4y/3/提出以下我遇到问题的代码。 我已经为下面的问题创建了一个 j
我有一个显示非常奇怪结果的微基准: @BenchmarkMode(Mode.Throughput) @Fork(1) @State(Scope.Thread) @Warmup(iterations =
我想知道是否有人可以回答我使用 StringBuilder 对象在 java 中执行这些语句中的哪一个会更好: 使用 .append(string1 + string 2) 对比 .append(st
假设我有两个相同类型的流。是否可以将一个流 append 到另一个流而无需事先将它们转换为列表? 例子: Stream ms = ...; Stream ns = ...; return ms.app
我有以下有效的 jQuery 代码,但它让我思考是否可以对正在 append 的内容执行 append 操作,而无需指定我想要 append 的内容。 append().append() 并没有达到目
这是为了显示诊断页面的检查。我有一个 .append(not_ok) 但当 swf 文件加载 100% 时,我想删除 not_ok 附加,然后添加一个 .append(ok)。 function ca
x = [[1,2],[2,3],[10,1],[10,10]] def duplicatingRows(x, l): severity = x[l][1] if severity =
我有一个列表,我正在尝试将数据注入(inject)其中。列表如下所示 data2 = ['TECH2_HELP', 'TECH2_1507', 'TECH2_1189', 'TECH2_4081',
为了有效地进行一些 DOM 操作,我分离了一个元素。在这个过程中,我遇到了一个有趣的情况: var $holder = $("#d"); var $wrapper = $("").css("borde
我遇到了图片在移动设备上加载速度不够快的问题。我的元素有一个图像和一个按钮。单击该按钮时,图像向下滑动,另一幅图像从顶部滑动以取代它。这是代码 html CSS .moveF
我正在编写一个包含 10 个遗愿 list 的简单哈希表。使用内置的 hash() 计算索引,然后对表大小取模。但是,当我尝试将该对象 append 到该索引处的存储桶列表时,它会 append 到每
我是 LISP 的新手,我正在尝试处理类的 cond 语句。目前,我正在尝试检查传递的值是否为列表,如果是,则将字母 d append 到列表中。 这是我的代码: (defun test(L) (li
我正在使用 Jquery 将数据 append 到 div。但是,append 语句之后页面上没有显示任何内容。 我尝试使用 $(window).load 来确保页面已加载,但这仍然不起作用。 HTM
我有以下代码; function SetupDropdowns() { var PrevType; dropdown1 = document.getElemen
我想在 smarty 中创建一个数组并在其中执行 append 功能!就像我在 smarty 模板中声明一个变量(如 {assign var=sizearr value=''} )然后我想在循环中向其
请考虑以下代码片段: var ul = $(".list_b").find("li").remove().end(); $.each(Sites, functi
我的日志记录配置中有两个 appenders。其中之一在 ERROR 事件上发送电子邮件。 一个类,我无法控制,垃圾邮件 ERROR 消息。所以我仍然想要那些消息,但不是在两个 appenders 中
我正在尝试制作 editText,我要在其中插入一些文本。在每三个字符之后,我想插入破折号。 例子: 类型:123 结果:123- 现在当光标在破折号后面并且你按下删除键时,我想删除破折号和破折号
当我尝试 append 简单的“hello”时,它会被 append ,但很快就会自动删除。仅当我在下面给出的表单中使用它时,才会出现此问题,如果删除该表单,则不会出现问题,并且 hello 会正确
我是一名优秀的程序员,十分优秀!