我有一个朋友写的代码(见下文)。
有两件事。
我使用浏览器的DOMparser方法创建一个DOM。我有一个示例SVG字符串可用于从中创建DOM。创建的新DOM是svgDOMfromString
还有另一个DOM svgDOM
下面的函数应该从SVGdom中提取路径及其矩阵。
我在函数顶部有一个示例SVG字符串-这是我想解析的内容,而不是SVGDom.
问题是我尝试解析的2个DOM具有不同的格式,因此,如果我尝试解析svgDOMfromString
,则会出现错误。
function parseAllPathsAndGetMatrixes(svgDOM)
{
var svgsvg = '<svg width="500" height="400" xmlns="http://www.w3.org/2000/svg"><!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ --><g><title>background</title><rect fill="#fff" id="canvas_background" height="402" width="502" y="-1" x="-1"/> <g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid"><rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/></g></g><g><title>Layer 1</title><ellipse ry="69" rx="75" id="svg_1" cy="172" cx="207" fill-opacity="0.7" stroke-width="2" stroke="#995757" fill="#FF8787"/></g></svg>';
var parser = new DOMParser();
svgDOMfromString = parser.parseFromString(svgsvg, "image/svg+xml");]
var paths = [];
// Create a clone of svgDOM
svgDOM = $(svgDOM).clone();
svgDOM.css("visibility", "hidden");
$("body").append(svgDOM);
svgDOM = svgDOM[0];
// Remove first group: there are no renderable elements
$(svgDOM).find('g').first().remove();
// Convert all elements to paths, because we cannot deal with other elements in further processings
$(svgDOM).find('ellipse,circle,line,polyline,polygon,rect').each(function ()
{
svgCanvas.convertToPathCustom($(this)[0]);
});
// Extract attributes of paths (including essential color attrs)
// and get the relation matrix of each path which is used for flattening transforms
$(svgDOM).find('path').each(function ()
{
var path = {};
var pathDOM = $(this)[0]; // DOM path
var nodes = [],
values = [];
for (var attr, i = 0, attrs = pathDOM.attributes, l = attrs.length; i < l; i++)
{
attr = attrs.item(i)
path[attr.nodeName] = attr.nodeValue;
}
//var arr = Raphael.path2curve(path.d); // mahvstcsqz -> MC
//arr = Raphael._pathToAbsolute(arr); // mahvstcsqz -> uppercase
//var d = Array.prototype.concat.apply([], arr).join(" ");
//path["arr"] = arr;
path["d"] = path.d;
// Get the relation matrix that converts path coordinates
// to SVGroot's coordinate space
var m = pathDOM.getTransformToElement(svgDOM);
path["matrix"] = {
a: m.a,
b: m.b,
c: m.c,
d: m.d,
e: m.e,
f: m.f
};
paths.push(path);
console.log(paths[0]);
});
$(svgDOM).remove();
//console.log("PATHS:",paths);
return paths;
}
最佳答案
svgDOM
是一个jQuery对象。请尝试记录svgDOM[0]
。
如果要使svgDOM成为jQuery对象,请执行:$(svgDOMfromString)