从d3选择中获取原始元素

时间:2017-08-03 11:15:16

标签: javascript html d3.js svg

我正在使用TypeScript编写Power BI的自定义视觉效果。在我的类构造函数中,我写this.svg = d3.select(this.target).append("svg").attr("id", "svg");this.target只保存一个标准的HTML元素,这对于这个问题并不重要。)

我的问题是,使用this.svg,如何才能获得原始SVG元素?从谷歌搜索似乎我应该能够使用this.svg.node(),但必须有一些微妙的进行,这使得它与“真正的”元素不同......

当我运行console.log(this.svg.node())时,其输出显示与Chrome开发者窗口中的console.log(document.getElementById("svg"))完全相同,所以没关系。

但是,使用表达式this.svg.node().getBoundingClientRect()会导致我的TypeScript无法编译,因为错误Property 'getBoundingClientRect' does not exist on type 'Node',而document.getElementById("svg").getBoundingClientRect()会返回正确的值。

我如何获得this.svg引用的真实的原始DOM元素?

我正在使用d3 v3。

1 个答案:

答案 0 :(得分:1)

.node()返回真实元素,这里的问题是在其他情况下.node()可以返回除Element以外的其他类型的对象,因此打字稿编译器无法知道它肯定会有getBoundingClientRect()功能。

解决方案是将对象转换为Element类型:

var svgElement = this.svg.node() as Element;
var boundingRect = svgElement.getBoundingClientRect();