单击表格,更新行,将鼠标悬停在行上,更新表格

2023-12-14

我是 D3 的新手,但到目前为止我很喜欢它。但我知道我的解决方案缺乏……优雅。

我试图有 2 个控件,一个表格和一个显示表格单元格表示的数据的图表。如果单击表格上的单元格,则相关行应突出显示。如果将鼠标悬停在一行上,关联的表格单元格将改变颜色。最终将有第三个控件显示特定于该单元的详细数据。不幸的是,如果我使用对更新函数的静态调用,我只能成功地完成这项工作。如果我试图变得聪明和充满活力,那么整个事情就会崩溃。

我已尽力在下面尽量减少我的示例。 Click table->update 行之所以有效,是因为对更新所有内容的 SelectData() 的调用使用常量数据。但是,在线上的鼠标悬停不起作用。最终我也需要表格更加动态,但现在我该如何解决这个问题?

<!DOCTYPE html>
<meta charset="utf-8">
<style>
    .lineDefault {
        fill: none;
        stroke: red;
        stroke-width: 1.5px;
        stroke-dasharray: 4,4;
    }
    .axis path,
    .axis line {
        fill: none;
        stroke: #000;
        shape-rendering: crispEdges;
    }
</style>
<body>
    <div id="wrap">
        <table>
            <tr>
                <td id="dataBlock" onclick="SelectData(0)">1</td>
                <td id="dataBlock" onclick="SelectData(1)">2</td>
            </tr>
            <tr>
                <td id="dataBlock" onclick="SelectData(2)">3</td>
                <td id="dataBlock" onclick="SelectData(3)">4</td>
            </tr>
        </table>
        <div>
            <svg class="chart"></svg>
        </div>
    </div>
    <script src="http://d3js.org/d3.v3.min.js"></script>
<script>
    var width = 600, height = 600;
    var maxx = 100,
        maxy = 100;

    var linedata = {};
    linedata[0] = [[0, 50 ],[ 50, 60 ],[100, 100]];
    linedata[1] = [[0, 40 ],[ 40, 40 ],[100, 90 ]];
    linedata[2] = [[0, 20 ],[ 50, 30 ],[100, 90 ]];
    linedata[3] = [[0, 0  ],[ 60, 30 ],[100, 30 ]];
    var activeElement = 0;
    var graphlines = {};
    var numlines = 0;

    chart = d3.select(".chart").attr("viewBox", "0 0 600 600").append("g");

    var x = d3.scale.linear().domain([0, maxx]).range([0, width]);

    var y = d3.scale.linear().domain([0, maxy]).range([height, 0]);

    var xAxis = d3.svg.axis().scale(x).orient("bottom");

    var yAxis = d3.svg.axis().scale(y).orient("left");

    var line = d3.svg.line()
        .x(function(d) { return x(d[0]); })
        .y(function(d) { return y(d[1]); });

    for (var i = 0; i < 4; i++) {
        graphlines[i] = chart
            .append("path")
            .datum(linedata[i])
            .attr("class", "lineDefault")
            .attr("id", "linedata")
            .attr("d", line)
            .on("mouseover", SelectData(i));
        numlines++;
    }

    function SelectData(n) {
        d3.selectAll("td").transition()
            .style("background-color", function(d, i) {
                return i == n ? "#c99" : "#fff";
            });
        activeElement = n;
        for (var i = 0; i<numlines; i++) {
            if (i == n) {
                graphlines[i]
                    .style("stroke-dasharray", "1,0")
                    .transition()
                    .style("stroke-width", "3")
                    .style("stroke", "steelblue");
            } else {
                graphlines[i]
                    .style("stroke-dasharray", "4,4")
                    .transition()
                    .style("stroke-width", "1.5")
                    .style("stroke", "red");
            }
        }
    }

</script>

鼠标单击表格会影响线条,鼠标悬停在线条上不会影响表格。我也将接受任何对我的优雅的影响以及修复它们的指示。


首先,您的鼠标悬停方法不起作用的原因是因为在这一行中:

        .on("mouseover", SelectData(i));

您正在调用 SelectData 方法当你打电话的时候.on() method.因此,当您完成初始化后,将选择最后一个项目,但没有函数侦听鼠标悬停事件。你想要的是传递函数name to the .on()方法。如果你让这个函数采取two参数(通常命名为d and i),那么d3会自动将索引值作为第二个参数传递。我最近写了一篇关于将函数作为参数传递给其他人的相当长的讨论,你可能会发现它很有用.

此外,您实际上没有利用 d3 选择结构,它可以一次调用完成您正在使用的所有操作for- 循环做。我建议花时间阅读一些教程关于 d3 选择的工作原理。

现在,回答你的主要问题:

选择数据与单击元素的数据相匹配的元素的常用解决方案是根据数据中的唯一 ID 为所有元素指定一个类。然后您可以轻松选择与给定数据对象关联的所有元素。如果用户选择一个对象d.name=Sue,并且您用该名称初始化了所有元素作为类名,那么您可以执行以下操作d3.select("path.Sue")并且d3.select("td.Sue")找到正确的。

您的示例数据似乎没有任何唯一的数据 id 值,只有索引号。所以你甚至不需要一个独特的类,你可以只使用nth-of-type(i+1)CSS 选择器。 (它是i+1因为CSS计数从1开始,而数据计数从0开始。)

不过,我建议您使用特殊的 CSS 类来应用所有突出显示样式。这样,就可以轻松选择当前突出显示的值来删除该类,而不必循环遍历所有内容来测试它是否匹配。您可以使用 CSS 过渡在类更改后过渡样式。

这是代码的小提琴版本,经过整理以正确使用 d3 并使用上述方法突出显示数据。

http://fiddle.jshell.net/g8z5h/

我还没有实现你的表的实时版本,但我建议你阅读嵌套选择教程弄清楚它是如何运作的。

我确实为每个数据块提供了自己的行,以便nth-of-type()选择器将正常工作(元素的 CSS 编号仅在它们都是同级元素时才有效,它们不能是跨多行拆分的表数据元素)。如果您需要原始布局才能工作,则必须根据元素的索引值指定元素类名称,并使用它们进行选择。我还将单击事件绑定移至代码中,因为 JSFiddle 将其所有代码包装在窗口加载事件中,因此 SelectData 函数在其外部不可见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击表格,更新行,将鼠标悬停在行上,更新表格 的相关文章

  • D3更新circle-pack数据新节点与现有节点重叠

    我正在关注一般更新模式 http bl ocks org mbostock 3808234但在分层方面存在问题 使用圆形包装布局 我pack新数据 update enter and exit圆形元素 然而 当新元素enter 它们重叠upd
  • 平移/缩放顺序尺度?

    我正在使用 d3 渲染简化的甘特图 并使用 d3 behavior zoom 进行平移和缩放 x 刻度是一个时间刻度 稍微修改为列中的中心日历日等 并且工作得很好 但是我在决定如何缩放 平移 y 刻度时遇到问题 其域是通常会出现的任务列表图
  • d3 v4 使用 TypeScript 进行拖放

    我正在使用 D3 库 v4 和 Angular2 我想拖放 svg 元素 我有一个代码 item call d3 drag on start dragStarted on drag dragged on end dragEnded and
  • 使用什么比例仅在 d3 js 中的 x 轴上表示年份

    我一直在 D3 Js 中开发年份 x 轴 与收入 y 轴 的面积图 数据如下 localData Revenue 4 5 Year 2011 Revenue 5 5 Year 2010 Revenue 7 0 Year 2012 Reven
  • 如何使用 d3.format 获取可本地化或可定制的 si 代码

    使用 SI 代码绘制图表正是我们想要的 我们的 y 轴值往往是较大的货币值 例如 10 411 504 201 20 缩写这个 至少在美国语言环境中 这应该转换为 10 4B 但是使用 d3 format 的 s 类型表示 SI 代码 这将
  • 合并两个 csv (d3)

    我使用以下代码加载两个 csv 文件 d3 csv sqrt100train csv function error data2 d3 csv sqrt100test csv function error data sqrt100train
  • 如何处理 d3 中 Beeswarm 图中的碰撞?

    我一直在玩这个例子here https gf neocities org co2bs co2bee html一会儿 我想做的是突出显示图中的单个节点 圆圈 通过使用边框使其变大 稍后我也想在其中添加文本或字母 目前 我已经圈了Bhutan图
  • NVD3 - 配置轴上的刻度

    我有一个 nvd3 折线图 它显示时间序列 但无法在 x 轴右侧获取刻度 对于较长的时间跨度 它会按预期工作 但对于较短的时间跨度 此处 12 31 05 至 01 01 06 多个刻度显示相同的日期 请看一下JSFiddle 上此图表的代
  • D3 时间解析返回 null

    根据此页面上的说明 https github com mbostock d3 wiki Time Formatting https github com mbostock d3 wiki Time Formatting我正在尝试解析 ISO
  • d3 饼图中的文本被路径覆盖

    我正在尝试按照 d3 的饼图示例进行操作http bl ocks org mbostock 3887235 http bl ocks org mbostock 3887235 我的代码的最小示例 const container graph
  • D3 删除千位的逗号分隔符

    我有一个包含 3 列的 json 其中一列是 年份 该列仅包含年份 没有日期 当我在 x 轴上绘制它时 年份会以逗号分隔符表示数千 所以在 json 中 日期的格式是 Year 1990 在 x 轴上 结果是 1 990 我一直在试图弄清楚
  • LeafletJs只显示一个国家

    我使用 Leafletjs 和 D3 来显示地图 我只想在地图上显示英国 Leaflet和D3是否可以只显示英国 这当然是可能的 现在的解决方案取决于您是想使用 D3 绘制英国 还是想从 Tile Server 获取它 在后一种情况下 有一
  • 使用 classed("active",true) 鼠标悬停时 D3 颜色变化

    我是 js 和 D3 的新手 我已经生成了某种热图 并且想使用 D3 的 on mouseover 更改图块的颜色 我可以显式更改颜色 但想使用 CSS 活动规则 可能是一些简单的东西可以修复 任何帮助将不胜感激 完整代码如下 Thanks
  • 设置 D3 力定向图

    致尊敬的读者 我对 javascript 相当陌生 我也遇到过这个问题 我正在尝试实现这个力导向图的修改版本 http mbostock github com d3 ex force html http mbostock github co
  • 根据 D3 中的属性值对对象进行排序

    我有一系列在 D3 中使用的对象 例如 var cities city London country United Kingdom index 280 city Geneva country Switzerland index 259 ci
  • 使用 Meteor 中的 D3 访问 csv 文件

    我已经使用 D3 成功渲染了一个 HTML 表格 显示了 csv 文件中的数据 但是当我将相同的代码移入 Meteor 项目时 我遇到了问题 传递到 d3 csv 回调中的数据对象一次拾取 HTML 文件 1 行 而不是 csv 数据 仅当
  • SVG 文本在 IE 中消失,直到我单击它

    我在 Internet Explorer Edge 以 Win7 上的为准 中遇到与 SVG 创建和操作相关的问题 在我正在开发的应用程序中 我们使用 d3 生成 SVG 形式的图形 在 Chrome 和 Firefox 中 它们工作得很好
  • 需要帮助从数组中为国家/地区着色,保留其余默认颜色

    我需要一些帮助从我创建的数组中获取数据 然后仅对数组中存在的国家 地区进行着色 而不在数组中的其余国家 地区我希望保留为默认颜色 我正在使用 D3 来完成所有这些工作 并且我非常确定我可以通过 D3 实现我需要的目标 但不确定如何实现 我想
  • d3js v5 + Topojson v3 关于加入 csv 和 json 的优化

    为了制作地图 我需要将一些值从 csv 导入到 json直接在代码中 为了加载 json 和 csv 文件 我使用 Promise 对象的异步操作 并使用两个循环和一个公共键在 json 文件上添加新属性 for var i 0 i lt
  • 如何部分或仅按百分比沿路径过渡

    我是 d3 的初学者 目前无法使用最新版本 但我使用的是 3 x 版本 我想要实现的应该很简单 但遗憾的是我没有找到有关如何做到这一点的资源 目标是在我的 svg 中显示一条路径 然后我想显示例如一个圆并沿着路径过渡 移动 追踪圆 如果我想

随机推荐

  • Spidermonkey 上的垃圾收集器问题...JS_AnchorPtr()?

    我推出了自己的 javascript 服务器端语言 称为 bondi 最近刚刚升级到新的蜘蛛猴 现在JS进入本地根和离开本地根的功能从1 8 5 api中消失 无用了 只使用锚点指针就足够了 JS AnchorPtr varname 在函数
  • Jasper Reports 中的子报表

    我有两个表格要打印在同一页上 这些表的数据将从自定义数据源的地图中提供 我需要实施它 我用谷歌搜索来实现这个任务 当时我遇到了子报告的概念 但我没有得到太多关于如何实现子报告的信息 我知道如何创建子报告 但我不知道如何使用自定义数据源填充子
  • jQuery UI 滑块 -> 支持鼠标滚轮?

    你可能已经知道我是 jQuery 的新手 所以不属于这个主题的代码改进仍然是非常允许的 这是我的 HTML 代码 div style display inline block width 120px div Bananas br div d
  • jasypt-spring-boot-1.17:属性解密失败,请确保加密/解密密码匹配

    我有 jasypt spring boot 1 17 带有 spring 版本 4 2 5 RELEASE 和 spring Boot 版本 1 5 3 RELEASE 我正在使用该网站的第一种方法 https github com uli
  • JavaScript 中同一行的多个比较/赋值运算符

    function test input var value input 1 在上面 函数内部的代码行在做什么以及它是如何工作的 首先是进行比较input 1 然后分配其结果 这将是true or false 变量value The is a
  • 如何自定义 HTML5 日期选择器

    我试图了解如何以特定方式自定义 HTML5 日期选择器 特别是格式类似于 日历图标 8 月 31 日 星期二右侧插入符号将打开日期选择器 经过一些初步搜索后 我找到了这些用于自定义日期输入文本框的伪元素 webkit datetime ed
  • c++ - FreeImage+OpenCV - 16 位图像扭曲

    我正在尝试加载图像 因为我必须对其应用算法 如果我加载每通道 8 位图像 则没有问题 但如果我加载 16bpc 图像 则会 毁掉 不幸的是 由于我没有足够的声誉 我无法上传图像 这些是它们的链接 源和 8bpc 处理结果 http post
  • 了解为什么 onCreateOptionsMenu 不显示菜单

    我正在阅读 Android For Dummies 一个例子使用了 onCreateOptionsMenu 我添加了一条日志消息 Override public boolean onCreateOptionsMenu Menu menu s
  • 字典递归比较程序

    我创建了一个程序来比较两个 python 字典并输出两者的差异 它适用于深度为 2 或更小的字典 我应该怎么做才能处理更深度的字典以及嵌套的字典 我遇到的另一个问题是 当我通过 get json 函数传递 json 数组时 它会作为列表返回
  • 使用 DirectShow 过滤器进行编码

    我正在努力将原始图像编码为 Windows 上的 avi 文件 可能使用 directshow 过滤器 使用的编解码器类型将由用户选择 我已经使用 Windows 视频 VFW 做了类似的事情 这很漂亮 因为它提供了简单的 api 来压缩数
  • 使用子进程时如何在 Python 中复制 tee 行为?

    我正在寻找一个 Python 解决方案 它允许我将命令的输出保存在文件中 而不将其从控制台隐藏 仅供参考 我问的是tee 作为 Unix 命令行实用程序 而不是 Python intertools 模块中的同名函数 Details Pyth
  • 展示 SkScene 中的另一个视图控制器

    我正在尝试展示另一个viewController来自我的 SkScene 这是我的主要viewController tuViewController Code void openTweetSheet FacebookLikeViewDemo
  • 打开拨号盘以拨打用户想要的号码

    我想在用户单击通话按钮时打开拨号盘 然后用户输入电话号码并拨打它 我知道我们可以这样打电话 UIApplication sharedApplication openURL NSURL URLWithString telprompt 2135
  • 如何在 Markdown pandoc 中打破长头线?

    在这个降价代码中 This a very long line header which was written in markdown 我想将长行分成两行 但保持标题的样式 这是错误的意图 This a very long line hea
  • 如何在 Ruby 中使用 mechanize 填写登录表单?

    下面是我希望用机械化填写的表格 已经尝试过常用的模型 例如 使用 Ruby 和 Mechanize 填写远程登录表单之谜 但没有成功
  • 如何使用链接按钮打开新选项卡?

    我正在使用一个linkbutton在一个gridview控件 我想将数据打开到新选项卡中 我尝试设置target blank 但它不起作用 我尝试过这样做 这是我的源代码
  • WCF 用户名身份验证:我可以在自定义 ServiceAuthorizationManager 中获取用户名吗?

    我有一个使用自定义的 WCF 服务ServiceAuthorizationManager 自定义身份验证管理器已设置为处理 Windows 和表单身份验证 但是 如果我连接的客户端设置为UserNameauth 我似乎无法在任何地方找到用户
  • 在一个类中使用带有成员函数的通用 std::function 对象

    对于一个类 我想将一些指向同一类的成员函数的函数指针存储在一个类中map储存std function对象 但我一开始就失败了这段代码 include
  • Clojure 生产者 消费者

    我正在学习 clojure 并通过生产者消费者示例尝试其并发性和有效性 这样做后 不得不使用 ref 和 deref 以及观察和取消观察感觉非常尴尬 我尝试检查其他代码片段 但是除了使用 Java Condition await 和 sig
  • 单击表格,更新行,将鼠标悬停在行上,更新表格

    我是 D3 的新手 但到目前为止我很喜欢它 但我知道我的解决方案缺乏 优雅 我试图有 2 个控件 一个表格和一个显示表格单元格表示的数据的图表 如果单击表格上的单元格 则相关行应突出显示 如果将鼠标悬停在一行上 关联的表格单元格将改变颜色