2017-09-27 2 views
0

Je dessine du SVG en ligne avec JavaScript. Principalement des chemins, mais j'ai aussi essayé un polygone. Je parviens à remplir une balise <svg> avec des chemins (un dans cet exemple simplifié) qui sont corrects SVG. Je le sais parce que:JavaScript SVG inline pas de rendu

  1. Lorsque le contenu de la balise svg est copié dans un fichier et ouvert dans Inkscape, l'image résultante est comme prévu.
  2. Si je modifie un <path> dans l'inspecteur de Firefox d'une manière ou d'une autre, en supprimant l'étiquette de fin </path> (ce qui fait juste que Firefox répare le code tel qu'il était à l'origine), ce chemin particulier s'affichera 't.
  3. Lorsque je copie tout le html dans la page tel qu'il est après l'exécution de javascript, et que je le mets dans un nouveau fichier html, le svg s'affiche correctement.

j'ai couru à l'origine dans ce problème dans Firefox, mais avons aussi vérifier que la création de svg ne fonctionne pas Edge soit.

Alors comment rendre le rendu svg en ligne immédiatement après sa création?

EDIT: Différent de celui-ci: JavaScript and SVG: Error on createElement(). Cette question concerne un document SVG, pas HTML. De plus, je ne reçois aucun message d'erreur.

<html> 
 

 
<head></head> 
 

 
<body> 
 

 
    <svg id="drawing"></svg> 
 

 
    <script> 
 
    function creel(tagname, id, cla, attrs) { 
 
     var n = document.createElement(tagname); 
 
     if (id) { 
 
     n.id = id; 
 
     } 
 
     if (cla) { 
 
     n.className = cla; 
 
     } 
 
     if (attrs) { 
 
     for (var i = 0; i < attrs.length; i = i + 2) { 
 
      n.setAttribute(attrs[i], attrs[i + 1]); 
 
     } 
 
     } 
 
     return n; 
 
    } 
 

 
    function drawline(c, ax, ay, bx, by, style) { 
 
     // Method for svg 
 
     var d = "M" + ax + "," + ay + " L" + bx + "," + by; 
 
     var p = creel("path", "", "", ["d", d]); 
 
     if (style) { 
 
     p.setAttribute("style", style); 
 
     } else { 
 
     p.setAttribute("style", "stroke:#555555;stroke-width:2; fill:none;"); 
 
     } 
 
     c.appendChild(p); 
 
    } 
 

 
    function drawit() { 
 
     var c = document.getElementById("drawing"); 
 
     c.setAttribute("width", 500); 
 
     c.setAttribute("height", 500); 
 
     c.setAttribute("viewBox", "0 0 500 500"); 
 
     c.setAttribute("xmlns", "http://www.w3.org/2000/svg"); 
 
     c.setAttribute("style", "border-style:solid;border-width:1px;background:#eeeeee;"); 
 

 
     var thinstyle = "stroke:#555555;stroke-width:2; fill:none;"; 
 

 
     drawline(c, 10, 10, 400, 400, thinstyle); 
 
    } 
 

 

 

 
    window.onload = function() { 
 
     drawit(); 
 
    } 
 
    </script> 
 
</body> 
 

 
</html>

+0

Que vous travailliez avec un document SVG ou un document HTML, vous ne pouvez pas utiliser createElement pour créer des éléments SVG. Non, vous n'obtiendrez pas de message d'erreur car l'utilisation de createElement n'est pas une erreur de syntaxe. –

Répondre

0

Créer des éléments SVG avec Document.createElementNS

Lors de la création directement à partir de JavaScript, vous devez créer des éléments svg avec Document.createElementNS:

var path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); 

Votre exemple rendu le chemin:

function creel(tagname, id, cla, attrs) { 
 
    // USE createElementNS HERE 
 
    var n = document.createElementNS('http://www.w3.org/2000/svg', tagname); 
 
    if (id) { 
 
    n.id = id; 
 
    } 
 
    if (cla) { 
 
    n.className = cla; 
 
    } 
 
    if (attrs) { 
 
    for (var i = 0; i < attrs.length; i = i + 2) { 
 
     n.setAttribute(attrs[i], attrs[i + 1]); 
 
    } 
 
    } 
 
    return n; 
 
} 
 

 
function drawline(c, ax, ay, bx, by, style) { 
 
    // Method for svg 
 
    var d = "M" + ax + "," + ay + " L" + bx + "," + by; 
 
    var p = creel("path", "", "", ["d", d]); 
 
    if (style) { 
 
    p.setAttribute("style", style); 
 
    } else { 
 
    p.setAttribute("style", "stroke:#555555;stroke-width:2; fill:none;"); 
 
    } 
 
    c.appendChild(p); 
 
} 
 

 
function drawit() { 
 
    var c = document.getElementById("drawing"); 
 
    c.setAttribute("width", 500); 
 
    c.setAttribute("height", 500); 
 
    c.setAttribute("viewBox", "0 0 500 500"); 
 
    c.setAttribute("xmlns", "http://www.w3.org/2000/svg"); 
 
    c.setAttribute("style", "border-style:solid;border-width:1px;background:#eeeeee;"); 
 

 
    var thinstyle = "stroke:#555555;stroke-width:2; fill:none;"; 
 

 
    drawline(c, 10, 10, 400, 400, thinstyle); 
 
} 
 

 
window.onload = function() { 
 
    drawit(); 
 
}
<svg id="drawing"></svg>

De plus, gardez à l'esprit que certains attributs sur les éléments SVG devraient/doivent être fixés sur la méthode setAttributeNS. L'un des attributs qui doit être défini avec setAttributeNS est xmlns.

+0

Merci! Cela a fonctionné pour cet exemple simplifié ainsi que mon site Web actuel. J'imagine que ça pourrait avoir quelque chose à voir avec les espaces de noms, mais je ne les ai pas vraiment compris. –