我对 Ajax 调用一无所知,已经阅读了几个小时,但所有教程都提到了加载方法和类似 click 的监听器。
我有一个函数(drawThreat),可以在我的svg上添加一些图标(fontawesome),有一个带有一堆x和ys的json文件,我需要做的就是有一个ajax调用来运行这个函数每 5 秒更新 json 文件中的所有 x 和 y,并更新页面上的 svg 元素。这是函数:
function drawThreat (x, y){
var canvas = d3.select("#map")
.append("svg")
.attr("width", 500)
.attr("height", 500)
.attr("id", "Threat");
var Threat = canvas.append('svg')
.append('text')
.attr('text-anchor', 'middle')
.attr('dominant-baseline', 'central')
.attr("x", x)
.attr("y", y)
.attr("class", "threat")
.style('font-family','FontAwesome')
.style('font-size','20px')
.style('fill', 'red')
.text(function (d) {
return '\uf2be'
});
return Threat
};
任何帮助将不胜感激:)即使它是您发现与问题相关的教程的链接。到目前为止,我看了 6 或 7 个教程,但没有成功。
最佳答案
如果我正确理解了您的需求,您基本上可以拥有类似于以下代码的代码:
var dataFileUrl = "url-to-your.json"; // assign the url to a variable
var canvas = d3.select("#map") // get a ref from the SVG element
.append("svg") // you might want to define it only one time
.attr("width", 500)
.attr("height", 500)
.attr("id", "Threat");
var updateInterval = setInterval(function(){
d3.json(dataFileUrl , function (jsonData) { // AJAX call
drawThreat(jsonData); // calls main function
});
},5000); // every 5 * 1000ms
function drawThreat (jsonData){
canvas.selectAll('text.threat').remove(); // makes sure we don't have old icons
canvas.selectAll('text')
.data(jsonData) // for each set in json
.enter()
.append('text') // create a text and append it to svg canvas
.attr("class", "threat") // with class of threat
.attr("x", function (d) { return d[0]; }) // first element of each set
.attr("y", function (d) { return d[1]; }) // second element of each set
.text('\uf2be');
};
为了减少js代码,我建议使用CSS添加样式和属性:
.threat{
text-anchor:middle;
dominant-baseline:central;
font-family:FontAwesome;
font-size:20px;
fill:red;
}
您还可以在这里查看它的实际效果:https://codepen.io/FaridNaderi/pen/awPBwm
希望它能帮助你理解要点。
关于javascript - 如何使用 d3 和 Ajax 将文本动态附加到 svg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043265/