javascript - “attr()”函数不适用于新创建的元素

标签 javascript d3.js

在此代码中,attr() 不适用于新创建的元素:

var rects = svgElem
    .selectAll("rect")
    .data(newArray);

rects.attr("fill", "black");

rects.enter()
    .append("rect")
    .attr("fill", "blue");

// this must work on enter and update but not working 
rects.attr("height", (d, i) => {
    return bar_height(d["data"]);
})

这是为什么?

这里是 fiddle 的链接:https://jsfiddle.net/Surpreet/7mcLj6qm/

最佳答案

这是 D3 v4,而不是 D3 v3。虽然您的代码可以在 D3 v3 中工作,但在 D3 v4 中不再工作。原因是这样的:

您的矩形选择...

var rects = svgElem
    .selectAll("rect")
    .data(newArray);

...是“更新”选择。因此,您设置的所有属性...

rects.attr("height", (d, i) => {
    return bar_height(d["data"]);
})
//etc...

...正在设置为选择。

解决方案:在“输入”选择中设置属性:

rects.enter()
    .append("rect")
    .attr("fill", "blue")
    .attr("height", (d, i) => {
        return bar_height(d["data"]);
    })
    //etc...

这是经过更改的代码:

var dataArray = [{
  "name": "Rushy Milkvetch",
  "latin": "Astragalus lonchocarpus Torr.",
  "light": "Green",
  "ease": 77
}, {
  "name": "Littleleaf Minerslettuce",
  "latin": "Montia parvifolia (Moc. ex DC.) Greene ssp. parvifolia",
  "light": "Mauv",
  "ease": -69
}, {
  "name": "Purple Dalea",
  "latin": "Dalea lasiathera A. Gray",
  "light": "Green",
  "ease": 12
}, {
  "name": "Strong Bladderpod",
  "latin": "Lesquerella valida Greene",
  "light": "Green",
  "ease": 33
}, {
  "name": "Marsh Cudweed",
  "latin": "Gnaphalium uliginosum L.",
  "light": "Mauv",
  "ease": 76
}, {
  "name": "Kay's Grama",
  "latin": "Bouteloua kayi Warnock",
  "light": "Mauv",
  "ease": -58
}, {
  "name": "Telegraph-plant",
  "latin": "Codariocalyx motorius (Houtt.) H. Ohashi",
  "light": "Orange",
  "ease": 73
}, {
  "name": "Western Catchfly",
  "latin": "Silene occidentalis S. Watson ssp. longistipitata C.L. Hitchc. & Maguire",
  "light": "Purple",
  "ease": 21
}, {
  "name": "Toyon",
  "latin": "Heteromeles arbutifolia (Lindl.) M. Roem. var. macrocarpa (Munz) Munz",
  "light": "Indigo",
  "ease": -21
}, {
  "name": "Woodrush Sedge",
  "latin": "Carex luzulina Olney var. atropurpurea Dorn",
  "light": "Pink",
  "ease": 19
}, {
  "name": "Conspicuous Reindeer Lichen",
  "latin": "Cladina conspicua Ahti",
  "light": "Green",
  "ease": -86
}, {
  "name": "American Mannagrass",
  "latin": "Glyceria grandis S. Watson",
  "light": "Violet",
  "ease": 78
}, {
  "name": "Greenland Pondweed",
  "latin": "Potamogeton groenlandicus Hagstr.",
  "light": "Puce",
  "ease": 36
}, {
  "name": "Santa Barbara Island Liveforever",
  "latin": "Dudleya traskiae (Rose) Moran",
  "light": "Purple",
  "ease": 94
}, {
  "name": "Harrisella",
  "latin": "Harrisella Fawc. & Rendle",
  "light": "Puce",
  "ease": -20
}];
var height = window.innerHeight,
  width = window.innerWidth;
var svgElem = d3.select("#content").append("svg")
  .attr("width", width)
  .attr("height", height)

var color = d3.scaleLinear()
  .domain([-100, 0, +100])
  .range(["red", "white", "green"]);



update(dataArray);

function update(dataArray) {
  var newArray = dataArray.map(function(item) {
    item["data"] = Math.floor(Math.random() * 100);
    return item;
  });
  var barWidth = width / dataArray.length;

  var elemDomain = d3.extent(newArray, function(d) {
    return d.data
  });

  var bar_height = d3.scaleLinear()
    .domain(elemDomain)
    .range([0, height]);

  var rects = svgElem
    .selectAll("rect")
    .data(newArray);

  // rects.attr("fill","black");

  rects.enter().append("rect").attr("fill", "blue")
    .attr("height", (d, i) => {
      return bar_height(d["data"]);
    }).attr("width", function(w) {
      return barWidth;
    }).attr("x", function(x, i) {
      return i * barWidth;
    }).attr("y", function(data, i) {
      return height - bar_height(data["data"]);
    });

}
<script src="https://d3js.org/d3.v4.min.js"></script>
<div id="content"></div>

关于javascript - “attr()”函数不适用于新创建的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46500933/

相关文章:

javascript - 如何将 ember 添加到 NodeJS 项目中?

javascript - Json 到 Jquery 数据表

javascript - 条形图未按 d3.JS 中的预期呈现

javascript - 显示灰度的 nvd3 图表

javascript - 循环数组并检查循环中的 MongoDB 集合(异步)

java - 在 Java.util.Date 中解析 org.mozilla.javascript.NativeDate

javascript - 如何使用javascript知道表单中文本框的数量

javascript - 修复垂直滚动时的 SVG 元素,Firefox 的问题

javascript - 在 d3js 强制布局中更新某些节点的样式

svg - 不可见 SVG 元素上的工具提示