【问题标题】:How to create multiple adjacent nodes per data element with d3.js selections如何使用 d3.js 选择为每个数据元素创建多个相邻节点
【发布时间】:2013-09-15 18:38:13
【问题描述】:

使用如下数据:

var days = ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"];

我需要把html结构变成:

<div>
  <input id="day0" type="checkbox">
  <label for="day0">Sun</label>

  <input id="day1" type="checkbox">
  <label for="day1">Mon</label>
  .... Etc

</div>

目前我目前失败的解决方案是:

var selection = d3.select("div");
var enter    = selection.selectAll("input").data(days).enter()

enter.append("input")
     .attr("type","checkbox")
     .attr("id",function(d,i){ return "day"+i;})

enter.append("label")
     .attr("for",function(d,i){ return "day"+i;})
     .text(function(d,i){return daysAbbr[i];})

这给了我一个不正确的 dom:

<div>
  <input id="day0" type="checkbox">
  <input id="day1" type="checkbox">
   .... Etc
  <label for="day0">Sun</label>
  <label for="day1">Mon</label>
  .... Etc
</div>

我将如何创建所有这些相邻的兄弟姐妹?

【问题讨论】:

    标签: javascript jquery dom d3.js dom-manipulation


    【解决方案1】:

    你得到这个结构是因为 D3 对选择进行了批处理。也就是说,您对选择执行的每个操作都会同时对所有元素执行。

    在您的情况下,您可能希望使用.each(),它允许您在选择的每个元素上调用一个函数。代码看起来像这样。

    var enter    = selection.selectAll("input").data(days).enter();
    enter.each(function() {
      selection.append("input");
      selection.append("label");
    });
    

    正如@Holger 指出的那样,这不起作用,因为.enter() 选择没有定义.each()。不过下面的方法会起作用。

    在您的情况下,更好的解决方案是将您想要一起出现的元素封装在另一个 div 中。这将允许您以更标准的方式使用 D3。代码如下所示。

    var enter    = selection.selectAll("input").data(days).enter();
    var divs = enter().append("div");
    divs.append("input");
    divs.append("label");
    

    【讨论】:

    • 根据d3文档,“输入选择只定义了追加、插入、选择和调用操作符”,请修改答案!
    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 2020-03-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多