gpt4 book ai didi

javascript - 使用 d3.create 创建和附加分离的元素

转载 作者:行者123 更新时间:2023-12-04 23:37:11 25 4
gpt4 key购买 nike

假设我创建了一个像这样的简单图形:

<!doctype html>
<html lang="en">

<head>
<script src="https://d3js.org/d3.v5.min.js"></script>
</head>

<body>
<svg></svg>
<script>
const svg = d3.select('svg');
const g = svg.append('g');

g.append('g')
.selectAll('g')
.data([5, 10, 20, 40])
.enter()
.append('rect')
.attr('fill', 'green')
.attr('x', d => d)
.attr('y', d => d)
.attr('height', d => d)
.attr('width', d => d);
</script>
</body>

</html>


但是,我想创建一个分离的 <g>,而不是仅仅附加到它。然后可以随意附加(例如,它可以从函数返回)。

对于 d3 V5,有一个 d3.create()创建分离元素的函数。

<!doctype html>
<html lang="en">

<head>
<script src="https://d3js.org/d3.v5.min.js"></script>
</head>

<body>
<svg></svg>
<script>
const svg = d3.select('svg');
const g = svg.append('g');

const detachedG = d3.create('g');
detachedG.selectAll('g')
.data([5, 10, 20, 40])
.enter()
.append('rect')
.attr('fill', 'green')
.attr('x', d => d)
.attr('y', d => d)
.attr('height', d => d)
.attr('width', d => d);

g.append(() => detachedG.node());
</script>
</body>

</html>


但它不会出现在浏览器中,即使 DOM 看起来一样。

任何想法如何解决这一问题?

最佳答案

只需命名它:

const detachedG = d3.create('svg:g');
这是进行更改的代码:

<!doctype html>
<html lang="en">
<head><script src="https://d3js.org/d3.v5.min.js"></script></head>
<body>
<svg></svg>
<script>
const svg = d3.select('svg');
const g = svg.append('g');

const detachedG = d3.create('svg:g');
detachedG.selectAll('g')
.data([5,10,20,40])
.enter()
.append('rect')
.attr('fill', 'green')
.attr('x', d => d)
.attr('y', d => d)
.attr('height', d => d)
.attr('width', d => d);

g.append(() => detachedG.node());
</script>
</body>
</html>

解释
当使用 append() 附加 SVG 元素时方法,98.47% 的 D3 程序员不使用命名空间(来源:Fakedata Inc.)。因此,而不是:
selection.append("svg:rect")
我们通常只是这样做:
selection.append("rect") 
那么,为什么这里需要命名空间呢?
在内部, d3.create 使用 d3.creatordocument.documentElement 调用它:
export default function(name) {
return select(creator(name).call(document.documentElement));
}
这改变了 this对于 d3.creator方法。当我们使用 append 创建 SVG 元素时,我们通常不使用 namespace 。 (内部使用 d3.creator ),因为:

If no namespace is specified, the namespace will be inherited from the parent element.


但是,由于使用了 document.documentElementthis ,在这种情况下,命名空间就变得必要了。

关于javascript - 使用 d3.create 创建和附加分离的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49999268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com