Dlaczego nie kopiować węzła/drzewa SVG, a następnie przyjmować style, jako defiend na znacznik (Będzie potrzebne oryginalne drzewo, ponieważ kopia może być bez stylów na wypadek, gdyby element był częścią dłuższego drzewa). To gwarantuje, że kopiujesz tylko te style, które są odpowiednie, jak ustawione w pliku CSS. typu eksport może być łatwo ustawione przed wysłaniem pakietu do blob
var ContainerElements = ["svg","g"];
var RelevantStyles = {"rect":["fill","stroke","stroke-width"],"path":["fill","stroke","stroke-width"],"circle":["fill","stroke","stroke-width"],"line":["stroke","stroke-width"],"text":["fill","font-size","text-anchor"],"polygon":["stroke","fill"]};
function read_Element(ParentNode, OrigData){
var Children = ParentNode.childNodes;
var OrigChildDat = OrigData.childNodes;
for (var cd = 0; cd < Children.length; cd++){
var Child = Children[cd];
var TagName = Child.tagName;
if (ContainerElements.indexOf(TagName) != -1){
read_Element(Child, OrigChildDat[cd])
} else if (TagName in RelevantStyles){
var StyleDef = window.getComputedStyle(OrigChildDat[cd]);
var StyleString = "";
for (var st = 0; st < RelevantStyles[TagName].length; st++){
StyleString += RelevantStyles[TagName][st] + ":" + StyleDef.getPropertyValue(RelevantStyles[TagName][st]) + "; ";
}
Child.setAttribute("style",StyleString);
}
}
}
function export_StyledSVG(SVGElem){
var oDOM = SVGElem.cloneNode(true)
read_Element(oDOM, SVGElem)
var data = new XMLSerializer().serializeToString(oDOM);
var svg = new Blob([data], { type: "image/svg+xml;charset=utf-8" });
var url = URL.createObjectURL(svg);
var link = document.createElement("a");
link.setAttribute("target","_blank");
var Text = document.createTextNode("Export");
link.appendChild(Text);
link.href=url;
document.body.appendChild(link);
}
Ta funkcja trawersu zdaje się iść tylko na jedną warstwę, co nie było dla mnie przydatne. W jQuery następujący wiersz pobiera wszystkie elementy gotowe do uruchomienia przez 'jawnieSetStyle'' $ ('# svg'). Find ("*"); ' – Craig