好的我一直在尝试根据数据集中的列数动态地将一些复选框附加到div。所以我认为d3将是要走的路,只需在输入中附加适当的属性,并根据数据确定标签的一些文本。我试过以下代码;
d3.select("body").selectAll("input")
.data([11, 22, 33, 44])
.enter().append("input")
.attr("checked", true)
.attr("type", "checkbox")
.attr("id", function(d,i) { return i; })
.attr("onClick", "change(this)")
.attr("for", function(d,i) { return i; })
.text(function(d) { return d; });
这导致页面上有4个复选框,但没有标签。
真正奇怪的是,当我检查元素时,生成的html似乎就像我所追求的那样,如下所示。
<input checked="true" type="checkbox" id="0" onclick="change(this)" for="0">11</input>
<input checked="true" type="checkbox" id="1" onclick="change(this)" for="1">22</input>
<input checked="true" type="checkbox" id="2" onclick="change(this)" for="2">33</input>
<input checked="true" type="checkbox" id="3" onclick="change(this)" for="3">44</input>
当我在页面上使用它时,我得到了我正在追求的内容。
我确信我错过了一些非常简单的东西,但对于我的生活,我看不出它是什么。感谢任何帮助!
答案 0 :(得分:4)
您的主要问题是您不能将文本放在<input>
标签之间。他们像<input />
一样自我关闭。您应该对该文本使用<label>
元素。
其他问题是ID的必须以字母开头(至少在HTML5之前),因此id="1"
将不起作用,但id=a1"
会。
那就是说,这段代码解决了这两个问题
d3.select("body").selectAll("input")
.data([11, 22, 33, 44])
.enter()
.append('label')
.attr('for',function(d,i){ return 'a'+i; })
.text(function(d) { return d; })
.append("input")
.attr("checked", true)
.attr("type", "checkbox")
.attr("id", function(d,i) { return 'a'+i; })
.attr("onClick", "change(this)");
答案 1 :(得分:2)
如果您使用<label>
-
d3.select("body").selectAll("input")
.data([11, 22, 33, 44])
.enter().append("label")
.text(function(d) { return d; })
.append("input")
.attr("checked", true)
.attr("type", "checkbox")
.attr("id", function(d,i) { return i; })
.attr("onClick", "change(this)")
.attr("for", function(d,i) { return i; });
答案 2 :(得分:1)
我知道这是一个很老的问题,但我想提供一个简单的解决方案,因为其他人不适合我...
您最初可以将标签附加到复选框,然后在完成后,您可以将文本添加到标签,然后在复选框之后而不是之前附加文本:
d3.select("body").selectAll("input")
.data([11, 22, 33, 44])
.enter()
.append("label")
.append("input")
.attr("checked", true)
.attr("type", "checkbox")
.attr("id", function(d,i) { return i; })
.attr("onClick", "change(this)")
.attr("for", function(d,i) { return i; });
d3.selectAll("label").text(function(d) { return d; });
答案 3 :(得分:0)
如前所述,您不能将文本添加到<input>
标记中。我的解决方案是在.html()调用中添加复选框。像这样:
d3.select('body').selectAll('label')
.data([11, 22, 33, 44])
.enter().append('label')
.html(function(d, i) {
return '<input type="checkbox" checked=true id="' + i + '" onClick="change(this) for="' + i + '">' + d;
})
希望这会有所帮助!
答案 4 :(得分:0)
另一种解决方案是使用span
元素将要显示的文本容纳在每个复选框的右侧。
在这里,我们假设您有一个带有id=some_div
的div,您要在其中附加复选框
var filter_controls_div_name="some_div";
var filter_controls__div=d3.selectAll("#"+filter_controls_div_name);
var date=null;
var field_value=null;
var field_value__list=[11,22,33,44];
for(var i=0;i<field_value__list.length;i++)
{
field_value=field_value__list[i];
var field__checkbox__div=filter_controls__div
.append("div")
.attr("class","checkbox")
;
var field__checkbox__div__label=field__checkbox__div
.append("label")
.attr("class","field__label")
;
var field__checkbox__div__label__input=field__checkbox__div__label
.append("input")
.attr("type","checkbox")
.attr("checked","true")
.attr("for",""+i)
.attr("field_value",field_value)
.attr("value",field_value)
;
field__checkbox__div__label
.append("span")
.text(field_value)
;
field__checkbox__div__label__input
.on(
"change"
,function(d)
{
var checkbox__element=d3.select(this);
console.log((date=new Date()).toISOString()
+", checkbox__element.property(\"checked\") is:"+(checkbox__element.property("checked"))
);
if(checkbox__element.property("checked"))
{
//do something when this checkbox is checked.
}
else
{
//do something when this checkbox is unchecked.
}
}
)
;
}