D3:在selectAll中获取元素属性

时间:2018-09-07 09:38:52

标签: d3.js

function arrayWindow(array, n) {
  if (array.length < n || n <= 0) {
    return []
  }

  let arrayLength = array.length
  let result = []
  for (let i = 0; i < arrayLength; i++) {
    let slicedArray = array.slice(i, n+i)
    if (slicedArray && slicedArray.length === n) {
      result.push(slicedArray)
      continue
    }
    break
  }
  return result
}

let arr = [1, 2, 3, 4, 5, 6]
console.log(arrayWindow(arr, 2))
console.log(arrayWindow(arr, 3))
console.log(arrayWindow(arr, 4))
console.log(arrayWindow(arr, 5))
console.log(arrayWindow(arr, 10))
console.log(arrayWindow(arr, 0))

带有<html> <svg></svg> <script src="d3.v4.min.js"></script> <script> var svg = d3.select("svg") .attr("width", 1000) .attr("height", 500) ; for (var i=0;i<3;i++) { svg.append("rect") .attr("x",i*80) .attr("y",i*40) .attr("width",30) .attr("height",30) ; } svg.selectAll("rect") .transition() .duration(500) .attr("x",2*d3.select(this).attr("x")) ; </script> </html> 的行返回错误。那么,读取每个元素的d3.select(this).attr("x") attr的正确代码是什么?

1 个答案:

答案 0 :(得分:3)

attr的{​​{1}}函数采用值或函数。在您的示例中,您正在为其传递一个常量值(该值应该是函数的主体)。

因此,d3将对范围内的任何d3.select(this)(最可能是this对象)进行操作。而是将其包装在如下函数中:

global

或者,您可以使用以下方法(取决于版本)

.attr("x", function() { 2 * d3.select(this).attr("x"); })

请注意,目前您还没有对.attr("x", (d, i, elements) => 2 * d3.select(elements[i]).attr("x")); 值应用任何保护,在尝试对任何值进行算术运算之前,我会认真考虑将其通过x扔掉它。