La réponse acceptée montre de manière trop compliquée. Comme Forresto le prétend dans sa réponse , " il semble les ajouter dans l'explorateur DOM, mais pas à l'écran " et la raison en est les différents espaces de noms pour html et svg.
La solution de contournement la plus simple consiste à "actualiser" l'ensemble du svg. Après avoir ajouté un cercle (ou d'autres éléments), utilisez ceci:
$("body").html($("body").html());
Cela fait l'affaire. Le cercle est à l'écran.
Ou si vous le souhaitez, utilisez un conteneur div:
$("#cont").html($("#cont").html());
Et enveloppez votre svg à l'intérieur du conteneur div:
<div id="cont">
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 100" width="200px" height="100px">
</svg>
</div>
L'exemple fonctionnel:
http://jsbin.com/ejifab/1/edit
Les avantages de cette technique:
- vous pouvez modifier le svg existant (qui est déjà dans DOM), par exemple. créé en utilisant Raphael ou comme dans votre exemple "codé en dur" sans script.
- vous pouvez ajouter des structures d'éléments complexes sous forme de chaînes, par exemple.
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
comme vous le faites dans jQuery.
- une fois les éléments ajoutés et rendus visibles à l'écran à l'aide de
$("#cont").html($("#cont").html());
leurs attributs, vous pouvez les modifier à l'aide de jQuery.
ÉDITER:
La technique ci-dessus fonctionne uniquement avec SVG "codé en dur" ou manipulé par DOM (= document.createElementNS etc.). Si Raphael est utilisé pour créer des éléments, (selon mes tests) la liaison entre les objets Raphael et SVG DOM est rompue si elle $("#cont").html($("#cont").html());
est utilisée. La solution de contournement est de ne pas utiliser $("#cont").html($("#cont").html());
du tout et d'utiliser un document SVG factice.
Ce SVG factice est d'abord une représentation textuelle du document SVG et ne contient que les éléments nécessaires. Si nous voulons par exemple. pour ajouter un élément de filtre au document Raphael, le mannequin pourrait être quelque chose comme<svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
. La représentation textuelle est d'abord convertie en DOM à l'aide de la méthode $ ("body"). Append () de jQuery. Et lorsque l'élément (filtre) est dans DOM, il peut être interrogé à l'aide des méthodes jQuery standard et ajouté au document SVG principal créé par Raphael.
Pourquoi ce mannequin est nécessaire? Pourquoi ne pas ajouter un élément de filtre strictement au document créé par Raphael? Si vous l'essayez en utilisant par exemple. $("svg").append("<circle ... />")
, il est créé en tant qu'élément html et rien n'est à l'écran comme décrit dans les réponses. Mais si l'ensemble du document SVG est ajouté, le navigateur gère automatiquement la conversion de l'espace de noms de tous les éléments du document SVG.
Un exemple éclaire la technique:
// Add Raphael SVG document to container element
var p = Raphael("cont", 200, 200);
// Add id for easy access
$(p.canvas).attr("id","p");
// Textual representation of element(s) to be added
var f = '<filter id="myfilter"><!-- filter definitions --></filter>';
// Create dummy svg with filter definition
$("body").append('<svg id="dummy" style="display:none"><defs>' + f + '</defs></svg>');
// Append filter definition to Raphael created svg
$("#p defs").append($("#dummy filter"));
// Remove dummy
$("#dummy").remove();
// Now we can create Raphael objects and add filters to them:
var r = p.rect(10,10,100,100);
$(r.node).attr("filter","url(#myfilter)");
La démonstration complète de cette technique est disponible ici: http://jsbin.com/ilinan/1/edit .
(Je n'ai (encore) aucune idée, pourquoi $("#cont").html($("#cont").html());
ne fonctionne pas lors de l'utilisation de Raphaël. Ce serait un hack très court.)
RMB
>edit as html
sur la balise html et appuyez sur Entrée, tout s'affiche (mais tous les écouteurs d'événement disparaissent). Après avoir lu cette réponse, j'ai changé mes appels createElement en createElementNS et maintenant tout fonctionne!