【问题标题】:d3 selection.attributes.key.nodevalue doesn't return the current DOM valuesd3 selection.attributes.key.nodevalue 不返回当前 DOM 值
【发布时间】:2016-10-23 10:27:20
【问题描述】:

每当我记录 selection.attributes 时,它都会记录完全需要的值,例如,如果有一个名为 y 的属性,它将记录 rect 在运行时在 DOM 中具有的相同值,但是每当我尝试使用 selection.attributes.y.nodeValue 访问该值时,它都会返回用于呈现它的 rect 的原始值。

我的问题是,如果实际的属性对象具有当前值,那么为什么当我尝试访问该对象中的键(在本例中为 y.nodeValue)时它会返回不同的值?

进一步解释:

这是我记录对象的代码和记录值检索的代码:

var notLiveYAttributes = chart.select("#not-live" + i + " rect.not-live")[0][0].attributes;
              console.log(notLiveYAttributes);
              console.log(notLiveYAttributes.y.value);

输出:

我在这里缺少什么以及如何检索属性的当前值(y 和高度)而不是最初呈现/填充的时间?

【问题讨论】:

标签: javascript html dom d3.js svg


【解决方案1】:

没有看到您的其余代码,我想说这里的问题是您的var notLiveYAttributes 在您应用于元素的任何修改之前被声明初始化。因此,鉴于 javascript 的性质和 javascript 代码的解析方式,浏览器会立即记录 notLiveYAttributes,其值可能与当前 DOM 值不匹配。

我做了这个简单的小提琴来说明这一点:https://jsfiddle.net/55ezeLef/1/

我用 y = 10 创建了一些 rects。然后,我进行了转换,将 y 更改为 50。

即使 console.log 的代码在转换之后出现 y 值,如下所示:

rects.transition().duration(1000)
    .attr("y", 50);

var notLiveYAttributes = svg.select(".rect2")[0][0].attributes.y.value;
    console.log("the immediate value is " + notLiveYAttributes);

它将记录the immediate value is 10

但如果我稍等一下:

setTimeout(function(){
    var notLiveYAttributes = svg.select(".rect2")[0][0].attributes.y.value;
        console.log("after waiting, the value is " + notLiveYAttributes);
}, 1500);

它将记录after waiting, the value is 50

【讨论】:

  • 这正是我正在做的事情,实际上我在应用转换之前访问了这些值,所以notLiveYAttribiutes 记录了转换后将应用的最终属性,就像访问时一样它只是记录当前时刻的值的单个值。非常感谢,非常感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多