Ich habe einen Knoten, der ein SVG-Element ist. Es wurde von D3 generiert.Img src wird codiert, wenn es als SVG eingestellt wird
In meiner Angular 2 App muss ich dieses Element nehmen und es in ein Png mit Dom-zu-Bild konvertieren.
Mein Problem ist, wenn ich das SVG-Element nehme und es auf die Quelle des img-Elements setze, ist der SVG-Code codiert.
Wie kann ich nur die tatsächliche Zeichenfolge in die Src setzen?
Dies ist mein Code. Im Grunde erstelle ich ein div, dann erstelle ich ein img und setze das img src so, dass es im Knoten ist.
var divelem = document.createElement('div');
var imgelem = document.createElement('img');
imgelem.height = 400;
imgelem.width = 300;
imgelem.src = node.outerHTML;
//imgelem.src = decodeURI(imgelem.src)
Dies ist der Wert von node.outerHTML
:
<svg width="166" height="195"><g trantsform="translate(86,[object Window])"><g class="layer" id="annual-stacked-bar" height="NaN" style="stroke-dasharray: 3, 3; fill: rgb(193, 191, 193);"><rect y="36.29999999999998" x="12" height="158.70000000000002" width="77.4"><text y="182.9" x="25.8" style="fill: rgb(255, 255, 255);">NaNundefined%</text></rect></g><g class="layer" id="annual-stacked-bar" height="NaN" style="stroke-dasharray: 3, 3; fill: rgb(142, 86, 158);"><rect y="15.669000000000011" x="12" height="20.630999999999972" width="77.4"><text y="31.07699999999998" x="25.8" style="fill: rgb(255, 255, 255);">NaNundefined%</text></rect></g><g><text dy=".9em" y="28.299999999999983" height="36.29999999999998">---------------------</text></g><g><text dy=".9em" x="100" y="26.299999999999983" height="36.29999999999998" style="fill: rgb(128, 128, 132);">Expected</text></g></g></svg>
imgelem.src
ist
Decodierung es nicht helfen, da es sich nicht um eine gültige URL, so bin ich nicht sicher, wie man den Wert in Nr. erhält de.outerHTML in imgelem.src zu sein.
UPDATE:
Ich habe versucht, dies zu tun, aber egal was ich tue, sobald es in src
gesetzt wird dann wird es codiert.
imgelem.src =
'<svg width="166" height="195"><g trantsform="translate(86,[object Window])"><g class="layer" id="annual-stacked-bar" height="NaN" style="stroke-dasharray: 3, 3; fill: rgb(193, 191, 193);"><rect y="36.29999999999998" x="12" height="158.70000000000002" width="77.4"><text y="182.9" x="25.8" style="fill: rgb(255, 255, 255);">NaNundefined%</text></rect></g><g class="layer" id="annual-stacked-bar" height="NaN" style="stroke-dasharray: 3, 3; fill: rgb(142, 86, 158);"><rect y="15.669000000000011" x="12" height="20.630999999999972" width="77.4"><text y="31.07699999999998" x="25.8" style="fill: rgb(255, 255, 255);">NaNundefined%</text></rect></g><g><text dy=".9em" y="28.299999999999983" height="36.29999999999998">---------------------</text></g><g><text dy=".9em" x="100" y="26.299999999999983" height="36.29999999999998" style="fill: rgb(128, 128, 132);">Expected</text></g></g></svg>';
Ich hätte nie gedacht, diesen Ansatz zu verwenden. Ich ging schließlich zum Rendern auf einer Leinwand und dann verwenden Sie das stattdessen, aber wenn ich eine Bibliothek entfernen kann, denke ich, dass Ihr Ansatz besser ist. –
Canvas sind auch toll, wenn es für dich funktioniert, das ist alles was du brauchst :) Happy Coding – jrmgx