我正在使用XMLHttpRequest加载SVG,但我似乎无法解析它。这就是我加载它的方式
var svgDoc;
var xhr = new XMLHttpRequest();
xhr.open("GET", "data/vectors.svg", true);
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
svgDoc = xhr.responseText;
console.log(svgDoc.getElementsByTagName("svg"));
} else {
console.error(xhr.statusText);
}
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText);
};
xhr.send(null);
它正在抛出未捕获的TypeError:undefined不是一个函数。当我尝试console.log(svgDoc.getElementsByTagName)时,我只是得到'未定义'。这就像我不能在SVG上调用任何XML DOM方法 - 尽管SVG只是XML。这是为什么?
答案 0 :(得分:4)
如果您使用XMLHttpRequest获取远程HTML网页的内容,则responseText属性是一个包含"汤"的字符串。所有HTML标签都很难操作和分析。分析此HTML汤字符串有三种主要方法:
参考:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest
在您的情况下,出现未定义的错误是因为responseText只是一个字符串(不是dom元素)。
答案 1 :(得分:0)
谢谢你们,你们是对的,但事实证明这是一个更好的解决方案。使用DOMParser将字符串解析为DOM对象,然后在其上调用DOM方法,如下所示:
var svg;
var xhr = new XMLHttpRequest();
xhr.open("GET", "data/vectors.svg", true);
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var svgStr = xhr.responseText;
var parser = new DOMParser;
var svgDoc = parser.parseFromString(svgStr, "text/xml");
svg = svgDoc.getElementsByTagName("svg")[0];
console.log(svg);
var viewBox = (svg.getAttribute('viewBox').split(' '));
offsetX = -parseInt(viewBox[2] / 2 + parseInt(viewBox[0]));
offsetY = parseInt(viewBox[3] / 2) + parseInt(viewBox[1]);
var sectionsXml = $(svg).find('g[id*="section"]');
for (var i = 0; i < sectionsXml.length; i++){
var sect = new section(sectionsXml[i]);
sect.position.setX(offsetX);
sect.position.setY(offsetY);
scene.add(sect);
}
} else {
console.error(xhr.statusText);
}
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText);
};
xhr.send(null);
排序。