我正在构建一个利用d3.js
进行数据可视化的工具。该工具依赖于webcomponentss和shadowDOM。 d3.js
无法仅通过d3.select
选择shadowDOM中的任何节点。有没有办法让d3
在shadowdom
内工作,或者我错过了一些明显的东西?
详细说明:
d3.select("#insideShadowDom")
如果您有类似的内容,不会返回/选择任何内容
<web-component>
#document-fragment
<div id="insideShadowDom"></div>
</web-component>
澄清:shadowDOM
由框架生成。我找到了获得初始shadowRoot
(注入)的方法。但是我仍然想知道是否可以告诉d3
关于shadowDOM
,即使我没有createShadowRoot()
返回的句柄。
答案 0 :(得分:6)
您可以传入对象 - 如果需要从回调中引用对象,也可以使用var:
<polymer-element name="my-element">
<template>
<div id="foobar"></div>
</template>
<script>
Polymer('my-element', {
ready: function() {
var foobar = this.$.foobar;
someCallback(function() {
d3.select(foobar).
...
});
...
}
});
</script>
</polymer-element>
答案 1 :(得分:2)
虽然DOM选择器不能跨DOM工作,但您可以通过.webkitShadowRoot
属性访问影子根(至少在Chrome中)。将此传递给d3.select()
,然后您可以照常选择阴影DOM中的任何元素。
演示here。
答案 2 :(得分:0)
我知道这是旧的,但是,使用最新的Polymer版本(1.0.0),您可以访问阴影dom元素:
<template> ... <div id="elementId"></div> ... </template>
Polymer({
ready: function() { var svg = d3.select(this.$.elementId).append('svg'; }
});
这将允许您渲染图表并适当选择阴影dom元素。