我正在使用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。
答案 0 :(得分:1)
.node()
返回真实元素,这里的问题是在其他情况下.node()
可以返回除Element
以外的其他类型的对象,因此打字稿编译器无法知道它肯定会有getBoundingClientRect()
功能。
解决方案是将对象转换为Element
类型:
var svgElement = this.svg.node() as Element;
var boundingRect = svgElement.getBoundingClientRect();