【发布时间】:2014-07-15 04:30:39
【问题描述】:
目标
我想将 d3.js 创建的 SVG 元素与 javascript 对象相关联 - 这样,当 SVG 元素在事件侦听器上可用时,我可以直接从它追溯到 javascript 对象。然而,这在我的情况下似乎并不奏效,如下所述。
(动机)
我有很多 SVG 元素,每个元素在逻辑上都与一个对象相关联,该对象包含与之相关的结构化数据。该数据决定了当任何 SVG 元素触发事件时要执行的操作,并且每个元素都不同
我的尝试
我只是将对象添加为 SVG 元素的新属性。我可以看到它已经添加好了。
然后我使用 d3 的 .on 函数附加事件侦听器。
我获得了我认为是d3.select(this) 触发事件的SVG 元素。实际上,我可以通过这种方式修改它的 SVG 属性,正如您在下面给出的代码笔中将小矩形悬停时看到的那样。
问题
虽然我可以确认我的对象已添加到 SVG 对象中,但当我在事件处理程序中检索 SVG 元素时,它具有除了该对象引用的所有内容。
我将此问题简化为 codepen 中的代码 - 日志记录演示了问题 - 将矩形悬停以检查它。
我做错了什么导致添加的对象引用不可用? 我应该如何正确地在 SVG 元素中使用对象引用,或者解决这个问题?
问题代码描述:
rectangle = main.append('rect')
.style('fill', '#0000FF')
.style('stroke-width', '0px')
.style('fill-opacity', '1')
.attr('height',30)
.attr('width',30)
.attr('id', '1')
rectangle.__test__ = 'test'
rectangle.on('mouseover', function(){
console.dir(d3.select(this))
/* __test__ is absent.... */
})
【问题讨论】:
-
您不能在 DOM 中存储对象引用——保存的将是序列化为字符串。听起来您需要一个查找表来检索具有特定 ID 的元素的 Javascript 对象。
-
我不完全确定最后的说法。请注意此处的矩形 - codepen.io/matanster/pen/ujiJq?editors=001。 svg 元素包含一个完全可用的对象。我认为 svg 是 DOM 的一部分,因为 SVG 是 DOM 命名空间。你怎么看?
-
在您的示例中它可以工作,因为该对象可以被序列化(成 JSON)和反序列化。它一般不起作用(例如,你不能用函数来做到这一点)。
-
D3 已经对数据做了完全相同的事情(在安全的地方)。您不能在 DOM 中存储行为(即函数)。
-
你能解释一下为什么不使用 d3 的数据对象将对象与元素关联起来,然后在事件处理程序中检索它吗?
标签: javascript html dom svg d3.js