javascript - 将多个 SVG 加载到 JavaScript 数组中,无需 DOM 附加

标签 javascript d3.js

我想执行以下操作:

function loadSvg(path) {
  d3.xml(path, 'image/svg+xml', function(xml) {
    return xml.documentElement;
  });
}

d3.json(jsonOfSvgFileNames, function(paths) {
  // paths = ['pathName','pathName2',...]
  var svgList = [];

  for(var p in paths) {
    var path = paths[p],
        svg = loadSvg(path);
    svgList.push(svg);
  }
});

我遇到了 d3.xml 调用完成后 xml.document 对象消失的问题。我知道这个永久性问题对于其他类型的服务器调用来说可能是一个问题,但我不确定需要使用哪些关键字来找到答案。

虽然一个答案是按需发出服务器请求,然后在 d3.xml 调用中将 SVG 附加到 DOM,但这不适用于我的应用程序。时间在我的应用程序中很重要,即使 300 毫秒的等待也太多了,这就是为什么我更喜欢进行批量加载。

Ninja-edit:我发现这是因为异步调用,并且对象在加载之前被插入数组。 promise 是否是一个可接受的解决方案(例如,load().then(push))?我没有太多地使用 promise 。是否有一个公认的 promise 标准库?

最佳答案

promise 确实是可行的方法:

var svgs = [];

$.when( loadData('gridList.json') ).then(function(status){
  console.log( status )
  for (var i = 0; i < svgs.length; i ++){
    $("body").append(svgs[i]);
  }
})


function loadSVG(path){
  var dfd = new jQuery.Deferred();
  d3.xml(path, 'image/svg+xml', function(xml) {
    svgs.push( xml.documentElement );
    dfd.resolve("loaded " + path);
  });
  return dfd.promise();
}


function loadData(jsonFile){
  var dfd = new jQuery.Deferred();
  d3.json(jsonFile, function(paths) {
      for( var i = 0; i < paths.length; i++ )
      $.when( loadSVG(paths[i]) ).then( function(status){
        console.log( status );
        if (svgs.length == paths.length)
          dfd.resolve( "All SVGs loaded!" )
      });
  });
  return dfd.promise();
}

关于javascript - 将多个 SVG 加载到 JavaScript 数组中,无需 DOM 附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20079195/

相关文章:

javascript - JS 将正则表达式拆分为两个不同的字符

javascript - 如何在 d3 VERSION 4 中获取相对于元素原点的 (x, y) 坐标

javascript - 单行上有多个进度条圆圈

javascript - 在 excel 中生成 html 页面的布局而不是在 css 中创建是否有益?

javascript - D3.js:上下文+焦点缩放多个图表

javascript - 外部 Js 文件未加载

javascript - 存储来自 AngularJS 输入表单的数据

javascript - 替换函数中的 _.each

java - 如何发送多个选项卡的公共(public)请求?

javascript - this.setState() 不会重新渲染