javascript - 如何使用 d3 和 Ajax 将文本动态附加到 svg?

标签 javascript jquery ajax d3.js svg

我对 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/

相关文章:

javascript - 是否有不需要服务器的客户端(javascript)图形库?

javascript - Codeigniter、jQuery 和 Ajax - 动态显示新数据库内容时防止页面刷新

javascript - 提交时清除 Ajax 表单字段

javascript - JQuery 旋转跨度 onclick

jquery - Chrome 和 Safari ajax 存在异步问题 :false

javascript - 为什么 post_max_size 和/或 upload_max_filesize 限制被忽略?

javascript - 我的 AngularJS 代码没有被执行?

javascript - Rails 4 jQuery 选择器不工作

javascript - jQuery:在所有事件发生变化后只运行一次回调函数

jquery - 我在哪里为我的自定义按钮添加 "onclick"