Est-il possible de travailler avec jquery et Svg directement (pas de plugins)?

J'essaie de travailler ensemble avec Jquery et Svg. Mais je ne veux pas utiliser de plugin.

Le problème que je traite maintenant est que lorsque j'essaie de travailler en utilisant le mode d'ajout traditionnel pour ajouter un enfant au document svg, l'objet n'est pas rendu. Voyons ce que j'ai essayé de faire:

/* Creating the svg container using pure JS */ var container = document.getElementById("svg_space"); mySvg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); mySvg.setAttribute("version", "1.2"); mySvg.setAttribute("baseProfile", "tiny"); container.appendChild(mySvg); /* Adding a child and setting attributes to the SVG container using pure JS */ Circle = document.createElementNS("http://www.w3.org/2000/svg", "circle"); Circle.setAttribute("cx", "60"); Circle.setAttribute("cy", "30"); Circle.setAttribute("r", "13"); Circle.setAttribute("class", "class1"); mySvg.appendChild(Circle); /* After this, the circle is rendered */ /* Then, I tried to use jQuery to perform the same action... */ $(mySvg).append("<circle />"); $(mySvg).find("circle").attr("cx","160"); $(mySvg).find("circle").attr("cy","70"); $(mySvg).find("circle").attr("r","30"); $(mySvg).find("circle").attr("class","class1" ); 

… mais après cette action, le cercle ne se rend pas. Je vérifie si au moins le cercle a été vraiment ajouté à l'arborescence DOM dans l'inspecteur des outils développeurs, et j'ai découvert que les deux éléments existent, avec les attributs appropriés précédemment définis, mais le cercle créé avec jQuery était comme s'il s'agissait d'un descendant html , Pas comme descendant svg. Cela signifie que les constructeurs, les prototypes et les autres méthodes liées à un élément de cercle svg ne faisaient pas partie du cercle 'jquery' de cette forme, mais plutôt de la pure étiquette html.

Existe-t-il un moyen de créer des éléments svg en tant que descendants svg à l'aide de jquery, ou est-ce que l'utilisation du javascript pur est meilleure malgré la perte de productivité?

Je n'ai pas pu essayer, mais je parie que cela fonctionnerait. Au lieu de

 $(mySvg).append("<circle />"); 

Faire

 $(mySvg).append(document.createElementNS("http://www.w3.org/2000/svg", "circle")); 

Si vous prévoyez de le faire plus d'une fois, peut-être

 function svgEl(tagName) { return document.createElementNS("http://www.w3.org/2000/svg", tagName); } $(mySvg).append(svgEl("circle")); 

C'est le même que l'ancien truc pour améliorer les performances via $(document.createElement("div")) au lieu de $("<div />") .

Cela fonctionne dans Chrome 11. Vous n'avez pas essayé dans d'autres navigateurs.

 $(mySvg).append("<svg><circle /></svg>"); $(mySvg).find("circle").unwrap(); $(mySvg).find("circle").attr("cx","160"); $(mySvg).find("circle").attr("cy","70"); $(mySvg).find("circle").attr("r","30"); $(mySvg).find("circle").attr("class","class1" ); 

Si je comprends bien, jQuery analyse html en passant la chaîne à l'analyseur HTML natif du navigateur. Les règles d'analyse HTML attribuent un espace de noms à l'élément en fonction de son nom et de ses éléments ancêtres, afin d'obtenir l'élément cercle dans l'espace de noms svg, il doit être analysé dans un élément svg.

Donc, ici, il est analysé et ajouté dans l'élément <svg> , puis le déroulement est appelé pour supprimer l'élément svg supplémentaire créé. Ce modèle d'append-and-unwrap est un peu laid, et je m'attends à ce que quelqu'un avec une meilleure connaissance jQuery puisse trouver une solution plus élégante, mais le concept est assez clair.

N'utilisez pas jQuery et SVG ensemble. JQuery a été conçu pour la manipulation DOM, Raphael est conçu pour la manipulation SVG.

Utilisez Raphael qui est une bibliothèque JavaScript qui vous permet de SVG.

Vous ne devriez vraiment pas faire tout ce qui est dur, cela va causer des problèmes.