【发布时间】:2017-05-19 03:04:30
【问题描述】:
我们有一个静态 SVG 图像,我们正在尝试动态添加工具提示,例如在 AngularJS 应用程序的上下文中使用 d3.js 在 SVG 图像内的对象上的悬停事件。
SVG 图像是一个平面图并且相当复杂,但是我们在 POC 过程中的起步非常小。下面是一个小节的代表性sn-p:
<g id="f3s362c12">
<g>
<rect x="75.2" y="92.4" pointer-events="visible" fill="none"
width="64.7" height="57.8" />
<polyline fill="none" stroke="#CDDDED" stroke-width="0.5"
stroke-miterlimit="10" points="118.4,149.9 140.3,149.9 140.3,92.4
75.2,92.4 75.2,128.7" />
</g>
<g>
<text transform="matrix(1 0 0 1 87.8719 144.8836)" fill="#010101"
font-family="arial, sans-serif" font-size="13.4182">362.12</text>
</g>
</g>
D3.js 对我们来说是新的,但是从我们的研究来看,它似乎能够做我们需要它做的事情,因为它似乎被设计为与 SVG 一起使用并在 SVG 中表示数据,但是所有的我们发现的例子是动态创建 SVG(主要是图表)但不操作现有的 SVG 图像。
简而言之,我们需要做的是:
- 查找 id 以“f3”开头的 g 标签,如上面的 g id="f3s362c12"
- 对于与 g 标签关联的每个矩形,添加一个工具提示悬停事件(可能是标签?)
- 当用户将鼠标悬停在说 g id="f3s362c12" 上时,选择矩形并获取我从 .csv 文件 IE 加载的 f3s362c12 的相应数据记录:
({"floor":"3","location":"f3s362c12","name":"David Byrne","occ":"歌手","img":"img/davidAvatar.jpg\r"})
- 将此信息添加到工具提示/标签中,这样当您将鼠标悬停在 g id=f3s362c12 上时,您会看到 David Byrne 的工具提示,他的职业是歌手及其头像。
我创建了一个Plunk:
- 在 HTML 中加载 SVG
- 加载 .csv 文件。
我们遇到的问题是 d3.js。 例如,在我们的Plunk 中,在 script.js 中,我们执行以下操作来查找我们的 g 标签:
var svg = d3.select("#svgFP");
var allG = svg.selectAll("g").each(function (d,i) {}
然而,在这一点上我们碰壁了,因为我们试图使用“this”关键字在 allG 上找到一个矩形。
if (this.id.indexOf("f3") > -1)
{
//1. Add label/div/hover
//2. Find corresponding record from array object.
//3. Inject respective name, occupation and image into label/div along with mouseover/mouseout event.
}
我们一直在使用 Firebug 来尝试查找要使用的属性,但至少可以说非常令人沮丧且毫无结果,所以我们认为 SO 中可能有一两个 d3/angular 大师可能能够给我们指路。
提前致谢。
【问题讨论】:
-
1. “不确定为什么当 SVG 设置为 INCLUDE 时 SELECT 不起作用,但它不起作用”——因为控制器在 ng-include 解析之前运行。 2.“出现错误:$digest 已经在进行中”您不需要任何应用程序或 $http 回调中的任何内容。只要 scope.data = response 就可以了。 3. 你的 1、2、3 计划很好 - 你有没有尝试过?或者你想让别人为你做这件事……
-
感谢您的建议。我们目前的停止点似乎是我们尝试类似的地方:this.select("rect");并接收:TypeError:this.select 不是函数谢谢。
-
我取得了一些进展,并且能够解决有关包含
-
g[id^='f3'] 应该比在 javascript 中迭代更有效地找到匹配项
-
@RobertLongson 正是我在解决方案中使用的。
标签: javascript angularjs d3.js svg