- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 D3 更新 HTML 表格中的数据。我需要更改多列中的数据,更新行数,并根据每个新数据数组为每行中的 SVG 制作动画。我已经尝试了多次尝试、教程、文档,而且我确信这对于对图书馆更有经验的人来说是一个简单的方法。
我在代码 tbody.selectAll('tr').remove();
中评论过的一种方法只是删除表中的所有行。但是因为没有起始位置,所以不可能为 SVG 设置动画。
我目前的方法也是错误的,虽然我是 D3 的新手所以我不确定为什么。当新数据进来时,它不会正确替换旧数据,而是根据新长度影响行长度,有时会替换,但通常会附加。单击此 jsfiddle 上的“运行”直到您看到 id 以较小的数字出现(例如“7”)。然后按更新按钮,您会看到新数据不会更新行,而是根据新数组中的数字附加到行。因此,如果下一个数组恰好有 8,那么你会看到一个 8。如果下一个数组有 10,那么你会看到两个十。我敢肯定,一旦这个问题得到修复,它也会修复 SVG 动画。
这是我正在使用的通用代码。
// create table, etc.
var table = d3.select('.chart').append('table');
var thead = table.append('thead');
var tbody = table.append('tbody');
// append the header row
thead.append('tr')
.selectAll('th')
.data(['id','val','svg']).enter()
.append('th')
.text(function (col_names) { return col_names; });
function update_table(){
data = newdata(); // update data to display
// remove existing rows
// this basically resets the table element
// but is not the right way
//tbody.selectAll('tr').remove();
// join new data with old elements, if any
var rows = tbody.selectAll('tr')
.data(data)
.enter()
.append('tr');
// add first two columns
rows.append('td').text(function(d) { return d.id; })
rows.append('td').text(function(d) { return d.val; });
// add svg
var svgcell = rows.append('td')
.append('svg')
.attr("width",20)
.attr("height",20);
svgcell.append('circle').transition().duration(500)
.attr("cx", 10)
.attr("cy", 10)
.attr("r", function(d) { return d.val; })
.style("fill", "red");
tbody.selectAll('tr').data(data).exit().remove();
}
最佳答案
对于 D3 代码,您的要求有点不寻常:您想要根据数据更新行,但又不想删除 <td>
s 包含圆圈...排除了最简单的解决方案,即定义 key function基于值列的数据绑定(bind)函数:
var rows = tbody.selectAll('tr')
.data(data, function(d) {
return d.val
});
有了这个简单的解决方案,我这里的解决方案有点尴尬。
首先,设置更新选择:
var rows = tbody.selectAll('tr')
.data(data);
然后输入选择:
var rowsEnter = rows.enter()
.append('tr');
rowsEnter.append('td')
.attr("class", "idColumn")
.text(function(d) {
return d.id;
});
rowsEnter.append('td')
.attr("class", "valColumn")
.text(function(d) {
return d.val;
});
rowsEnter.append('td')
.append('svg')
.attr("width", 20)
.attr("height", 20).append('circle')
.attr("class", "svgCircle")
.style("fill", "red");
现在,按类选择所有列,重新绑定(bind)数据(这是我之前提到的尴尬部分),并为圆圈设置过渡:
d3.selectAll(".idColumn").data(data).text(function(d) {
return d.id;
});
d3.selectAll(".valColumn").data(data).text(function(d) {
return d.val;
});
d3.selectAll(".svgCircle").data(data).attr("cx", 10)
.attr("cy", 10).transition().duration(500)
.attr("r", function(d) {
return d.val;
})
.style("fill", "red");
最后是退出选择:
rows.exit().remove();
这是演示:
// D3 update data, number rows in html table, animate svgs in last column
function newdata() {
var n = [];
var r = Math.ceil(Math.random() * 20);
for (var i = 0; i < r; i++) {
n.push({
"id": r,
"val": Math.random() * 10
});
}
return n;
}
var data = newdata(); // generate data array of random length
// create table, etc.
var table = d3.select('.chart').append('table');
var thead = table.append('thead');
var tbody = table.append('tbody');
// append the header row
thead.append('tr')
.selectAll('th')
.data(['id', 'val', 'svg']).enter()
.append('th')
.text(function(col_names) {
return col_names;
});
// update function
function update_table() {
// update data to display
data = newdata();
// remove existing rows
// this basically resets the table element
// but is not the right way
//tbody.selectAll('tr').remove();
// join new data with old elements, if any
var rows = tbody.selectAll('tr')
.data(data);
var rowsEnter = rows.enter()
.append('tr');
rowsEnter.append('td')
.attr("class", "idColumn")
.text(function(d) {
return d.id;
});
rowsEnter.append('td')
.attr("class", "valColumn")
.text(function(d) {
return d.val;
});
rowsEnter.append('td')
.append('svg')
.attr("width", 20)
.attr("height", 20).append('circle')
.attr("class", "svgCircle")
.style("fill", "red");
d3.selectAll(".idColumn").data(data).text(function(d) {
return d.id;
});
d3.selectAll(".valColumn").data(data).text(function(d) {
return d.val;
});
d3.selectAll(".svgCircle").data(data).attr("cx", 10)
.attr("cy", 10).transition().duration(500)
.attr("r", function(d) {
return d.val;
})
.style("fill", "red");
rows.exit().remove();
}
update_table();
var button = document.getElementById("update");
button.addEventListener("click", function(e) {
update_table();
});
<script src="https://d3js.org/d3.v4.min.js"></script>
<button id="update">update</button>
<div class="chart"></div>
如果您喜欢 fiddle ,这里就是:https://jsfiddle.net/evzx2x6L/
关于javascript - D3 更新数据,html 表中的行数,最后一列中的动画 svgs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41818638/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!