2016-06-21 26 views
1

每当我登录selection.attributes时,它会记录所需的值,例如,如果存在名为y的属性,它将记录相同的值rect在运行时在DOM中有,但是每当我尝试使用selection.attributes.y.nodeValue访问该值时,它都会返回它所呈现的rect的原始值。d3 selection.attributes.key.nodevalue不返回当前DOM值

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

对于进一步的解释:

这里是我的日志对象和代码代码用于记录值的检索:

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

输出:

enter image description here

什么时我在这里错过了,以及如何检索属性的当前值(y和h)八),而不是当它最初呈现/填充?

+0

你尝试过不同的浏览器吗? – Klaujesi

+0

这不是浏览器问题,我在这里解释了这个问题:http://stackoverflow.com/questions/37951771/d3-selection-attributes-key-nodevalue-doesnt-return-the-current-dom-values #comment63386583_37968197 –

回答

2

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

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

我其中y = 10。在一些rects然后,我由过渡,改变y以50

即使代码到控制台。记录过渡后的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

+1

这正是我正在做的,实际上我在应用转换之前访问了值,所以'notLiveYAttribiutes'记录了转换后应用的最终属性,在访问单个值时在当前时刻记录了该值。非常感谢,非常感谢您的意见。 –