从 html 创建数组以使用 D3 Wordcloud 显示
Creating array from html to display using D3 Wordcloud
恐怕这是一个关于从 HTML 元素构建数组的非常基础的 Javascript 问题。我一直在寻找答案,但我认为有一些重要的基础知识对我来说没有意义,我在兜圈子,所以一些外部专家的观点将不胜感激!
我们正在使用 Moodle 运行 在线课程,在介绍周,我们想通过数据库模块收集用户的一些信息,例如国家,然后向他们展示小组回复.
Moodle 提供了一个带有占位符 [[data]] 的模板,您可以将其包装在 html 中,在本例中为 div:
<div class="country">[[country]]</div>
我遇到的问题是将所有这些 div 的内容放入一个数组中。我发现这里解释了这个方法,但我尝试 push/concat 似乎没有用:
var countryList = document.getElementsByClassName("country");
Array.prototype.forEach.call(countryList, function() {});
我希望将它放在数组中的原因是我可以使用 Jason Davies 的 d3.js 词云将内容推送到现有模板中。 Here's a link to GitHub,下面复制了一个简单云的最基本代码,供参考。
本质上,我希望能够从 HTML 个元素创建一个数组,并将其与下面使用的单词数组结合起来:
var fill = d3.scale.category20();
d3.layout.cloud().size([300, 300])
.words([
"Hello", "world", "normally", "you", "want", "more", "words",
"than", "this"
].map(function(d) {
return {
text: d,
size: 10 + Math.random() * 90
};
}))
.padding(5)
.rotate(function() {
return ~~(Math.random() * 2) * 90;
})
.font("Impact")
.fontSize(function(d) {
return d.size;
})
.on("end", draw)
.start();
function draw(words) {
d3.select("body").append("svg")
.attr("width", 300)
.attr("height", 300)
.append("g")
.attr("transform", "translate(150,150)")
.selectAll("text")
.data(words)
.enter().append("text")
.style("font-size", function(d) {
return d.size + "px";
})
.style("font-family", "Impact")
.style("fill", function(d, i) {
return fill(i);
})
.attr("text-anchor", "middle")
.attr("transform", function(d) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
})
.text(function(d) {
return d.text;
});
}
您应该能够使用类似以下内容获得所需的数组:
var countryList = document.querySelectorAll('.country');
var countryNames = Array.prototype.map.call(countryList, function(c){return c.textContent});
恐怕这是一个关于从 HTML 元素构建数组的非常基础的 Javascript 问题。我一直在寻找答案,但我认为有一些重要的基础知识对我来说没有意义,我在兜圈子,所以一些外部专家的观点将不胜感激!
我们正在使用 Moodle 运行 在线课程,在介绍周,我们想通过数据库模块收集用户的一些信息,例如国家,然后向他们展示小组回复.
Moodle 提供了一个带有占位符 [[data]] 的模板,您可以将其包装在 html 中,在本例中为 div:
<div class="country">[[country]]</div>
我遇到的问题是将所有这些 div 的内容放入一个数组中。我发现这里解释了这个方法,但我尝试 push/concat 似乎没有用:
var countryList = document.getElementsByClassName("country");
Array.prototype.forEach.call(countryList, function() {});
我希望将它放在数组中的原因是我可以使用 Jason Davies 的 d3.js 词云将内容推送到现有模板中。 Here's a link to GitHub,下面复制了一个简单云的最基本代码,供参考。
本质上,我希望能够从 HTML 个元素创建一个数组,并将其与下面使用的单词数组结合起来:
var fill = d3.scale.category20();
d3.layout.cloud().size([300, 300])
.words([
"Hello", "world", "normally", "you", "want", "more", "words",
"than", "this"
].map(function(d) {
return {
text: d,
size: 10 + Math.random() * 90
};
}))
.padding(5)
.rotate(function() {
return ~~(Math.random() * 2) * 90;
})
.font("Impact")
.fontSize(function(d) {
return d.size;
})
.on("end", draw)
.start();
function draw(words) {
d3.select("body").append("svg")
.attr("width", 300)
.attr("height", 300)
.append("g")
.attr("transform", "translate(150,150)")
.selectAll("text")
.data(words)
.enter().append("text")
.style("font-size", function(d) {
return d.size + "px";
})
.style("font-family", "Impact")
.style("fill", function(d, i) {
return fill(i);
})
.attr("text-anchor", "middle")
.attr("transform", function(d) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
})
.text(function(d) {
return d.text;
});
}
您应该能够使用类似以下内容获得所需的数组:
var countryList = document.querySelectorAll('.country');
var countryNames = Array.prototype.map.call(countryList, function(c){return c.textContent});