在D3中选择DOM元素,但不选择其子元素
Selecting DOM elements but not their children in D3
我正在使用SCXML,我的数据是这样的:
<state id="umbrella_state">
<state id="state1"></state>
<state id="state2>
<transition event="cancel"></transition>
<transition event="next"></transition>
</state>
<transition event="quit"></transition>
</state>
我正在使用D3来可视化状态及其转换,但我很难准确地选择所需的转换。
d3.selectAll("#transitions") // selects everything, which I don't want
我想要的是只选择一个状态的过渡,而不是它的子状态。例如,state1的唯一转换是"quit"。我想象如下:
d3.selectAll("[id=umbrella_state]").selectAll("transition :not(transition > transition)")
(并对每个父状态重复此操作,直到达到所需的状态)。
根据API文档,select应该只获取第一个匹配它的选择器条件的元素,而不是每个元素。
另外,根据API文档,d3选择器使用CSS3标准,所以像这样的东西
d3.select("state ~ transition")
应该只选择状态元素之后的第一个转换兄弟。(~
字符表示在第一个选择器之后的某个点上的兄弟,这里更多)不幸的是,没有CSS3选择器用于在1之前的兄弟。
我用这样的选择器解决了我的问题:
d3.selectAll("[id='" + state.attr("id") + "'] > transition")
翻译过来就是:
d3.selectAll("[id='umbrella_state'] > transition")
我对每一层都递归地这样做,直到到达最深的状态。
相关文章:
- WebdriverIO waitForExist()选择元素's选定的选项
- 如何选择元素的第n个子元素
- Angular没有根据模型更新我的选择元素
- jquery使用name from变量按类选择元素
- 如何使用jQuery按数据日期属性选择元素
- 向html选择元素添加选项
- 使用Jquery在相同类型的元素中选择元素
- 他们是如何使用angular/jqLite find()方法按属性名称和值选择元素的?ng conf 2015
- 如何在Angular中清除选择元素中的过滤器
- 使用其中一个元素作为参考点,从Javascript数组中选择元素
- Javascript选择元素到字符串的比较
- Angular始终选择选择元素中的第一个选项
- 使用 jquery .find() 遍历按类和存储属性选择元素
- 通过 id json, jquery 选择元素
- 如何基于另一个已经存在的选择器选择元素
- 禁用多个选择元素中的非“选定”选项,但使用 jquery 的一个除外
- HTML 选择元素的只读等效项
- 在iPad上,如何通过Javascript事件在选择元素上设置focus()而不显示选项
- 单击事件似乎不适用于 IE 中的选择元素
- Angular js,在选择元素上,我想 POST 数据以将其保存在数据库中,然后我想使用 PUT 更新它而无需重新加载