d3:对一个类采取行动以响应一个事件
d3: acting on a class in response to an event
我正在使用d3将数据绑定到一组节点,我希望对其进行排列,以便在单击其中一个节点(或其他事件)时,所有节点都会动态更改。根据我对d3的理解,我认为它应该这样工作:
var nodes = svg.selectAll(".node")
.data(someData)
.enter()
.append("circle")
.attr("r", 5)
.attr("class", ".node")
.style("fill", "blue")
.on("click", function(d, i) {
svg.selectAll(".node").style("fill", function(e, j) {
if(someCondition(i, j))
return "red";
else
return "green";
});
});
但当我点击时什么也没发生。即使是更简单的代码:
var nodes = svg.selectAll(".node")
.data(someData)
.enter()
.append("circle")
.attr("r", 5)
.attr("class", ".node")
.style("fill", "blue")
.on("click", function(d, i) {
svg.selectAll(".node").style("fill", "red");
});
(我预计当点击其中一个节点时,会将所有节点变为红色)不起作用。
通过调用为圆圈设置类名的方式存在错误
.attr("class", ".node")
这样做会将属性设置为class=".node"
,这肯定不是您想要的。此外,这将不是一个有效的类名。有关允许哪些字符组成类名的解释,请参阅此答案。要选择这个类名,必须执行选择器字符串中有两个点的svg.selectAll("..node")
。
话虽如此,更改您的代码以去掉圆点使其工作:
.attr("class", "node")
经验教训:
.attr()
从字面上获取属性的值。当应用CSS选择器时,您可以在它前面加一个点来选择类名。
您需要指定圆的"cx"answers"cy"属性,否则您将看不到任何内容。
var nodes = svg.selectAll(".node")
.data(someData)
.enter()
.append("circle")
.attr("r", 5)
//add cx and cy here:
.attr("cx", function(d) {return d+10;/*just an example*/})
.attr("cy", function(d) {return 2*d+10;/*just an example*/})
.attr("class", "node")
.style("fill", "blue")
.on("click", function(d, i) {
svg.selectAll(".node").style("fill", "red");
});
相关文章:
- 有一个响应式按钮
- 必须单击两次才能得到一个响应
- 具有一个响应的多个回调-Node JS
- 通过管道将多个文件传送到一个响应
- 如何创建一个响应单击或输入按下的 javascript 函数
- XMLHttpRequest分块响应,只读取正在进行的最后一个响应
- 我如何引用并返回一个响应,基于一个单选按钮的答案,该单选按钮包含在另一个单选键中
- AJAX——可以在请求响应上标记到前一个响应的末尾
- 在expressjs中,从函数向路由发送一个响应
- 如何用react构建一个响应式网站
- 如何设置一个响应chart.js图表不填满屏幕
- 如何在html css和jquery上创建一个响应式菜单,逐个隐藏li元素
- 我如何使一个响应图像地图,其中图像和热点自动调整大小与窗口
- 创建一个响应式html表
- 如何使用fancybox创建一个响应式弹出框
- 寻找一个响应式javascript图表库
- 创建一个响应式容器
- 如何解析json中的一个响应
- 做一个响应式的Javascript水平导航,中间有Logo
- 卓别林是一个响应路由的永久控制器