【发布时间】:2013-09-13 00:56:58
【问题描述】:
我觉得这是我的一个非常基本的误解。
我正在使用此树可视化:http://bl.ocks.org/mbostock/4339083
当用户单击具有子节点的节点时,原始版本的节点会打开和折叠。我想让它使单击没有子节点的节点具有其他效果(具体来说,我希望它在另一个窗口中打开图像)。
所以,这里是分配点击功能的地方:
var nodeEnter = node.enter().append("g")
.attr("class", "node")
.attr("class", function(n) {
if (n.children) {
return "inner node"
} else {
return "leaf node"
}
})
.attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
.on("click", click);
我添加了第二类分配来区分有子节点和没有子节点。
这是我修改后的点击功能:
function click(d) {
if (d.attr("class") == "inner node") {
if (d.children) {
d._children = d.children;
d.children = null;
} else {
d.children = d._children;
d._children = null;
}
} else if (d.attr("class") == "leaf node") {
// open image
}
update(d);
}
我添加了外部 if 语句来区分这两种节点。
所以,当我点击时,目前没有任何效果。我假设我的 'd.attr("class") == "inner node"' 出现错误,要么是因为该类属性的分配不起作用,要么是因为我写的是胡言乱语。但是,当我将其更改为“节点”时,它也不起作用。
我还想到,分配可能会因所有节点开始折叠这一事实而失败 - 因此“n.children”可能会返回 false,即使有子节点也是如此。让孩子崩溃会影响这个吗?
非常感谢任何帮助。
------------------** 编辑 **------------ ------------------
通过玩了一下,我想我已经确定我应该使用“d.class”,而不是“d.attr('class')”。但是,这仍然无法正常工作。我假设我误解了 d 在这里代表什么 - 对吗?
------------------** 编辑 2 **------------ ------------------
好的,我的第一次编辑是错误的。不过多亏了祈祷者,我已将代码更改为:
function click(d) {
if (d.children || d._children) {
if (d.children) {
d._children = d.children;
d.children = null;
} else {
d.children = d._children;
d._children = null;
}
} else {
d3.select( this ).attr("fill", "#CCCCCC");
}
update(d);
}
现在可以了。但是,与我的预期相反,我更改的是文本填充,而不是圆形填充。这是为什么?文本和圆圈是可以点击的不同区域,但无论我点击哪一个,总是会改变文本。我假设“this”指的是节点,而不是特定的圆圈或文本,那么为什么它会选择一个而不是另一个呢?
【问题讨论】:
-
您能否提供一些上下文与 JSFiddle 包含您的问题的最小示例?我已经回答了,但没有更多信息,我只能猜测。
-
与bl.ocks.org/mbostock/4339083 非常相似。我已将其放入 jsFiddle 并进行了一些更改以适应我当前的问题,但树形图未显示(抱歉,我之前没有使用过 jsFiddle)。我想我只是误解了 jsFiddle 的工作原理。这是:jsfiddle.net/v8S9j/1。我电脑上的版本会显示树,但不会响应点击。
-
只要您在群组 (
svg:g) 上注册您的点击处理程序,this就应该引用群组。请参阅此fiddle 进行澄清。因此,您无法通过this真正设置视觉属性,因为它指的是本身不可见的组。另请注意,视觉属性(您将放入 CSS 中的内容)是通过.style()而不是.attr()更改的。
标签: javascript d3.js