La risposta accettata mostra un modo troppo complicato. Come afferma Forresto nella sua risposta , " sembra aggiungerli in DOM Explorer, ma non sullo schermo " e la ragione di ciò sono diversi spazi dei nomi per html e svg.
La soluzione più semplice è "aggiornare" l'intero svg. Dopo aver aggiunto la cerchia (o altri elementi), usa questo:
$("body").html($("body").html());
Questo fa il trucco. Il cerchio è sullo schermo.
O se vuoi, usa un div contenitore:
$("#cont").html($("#cont").html());
E avvolgi il tuo svg all'interno del contenitore 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'esempio funzionale:
http://jsbin.com/ejifab/1/edit
I vantaggi di questa tecnica:
- puoi modificare lo svg esistente (che è già in DOM), ad es. creato usando Raphael o come nel tuo esempio "hard coded" senza script.
- è possibile aggiungere strutture di elementi complessi come stringhe, ad es.
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
come fai in jQuery.
- dopo che gli elementi sono stati aggiunti e resi visibili sullo schermo usando i
$("#cont").html($("#cont").html());
loro attributi possono essere modificati usando jQuery.
MODIFICARE:
La tecnica sopra funziona solo con SVG "hard coded" o DOM manipolato (= document.createElementNS ecc.). Se Raphael viene utilizzato per creare elementi, (secondo i miei test), il collegamento tra oggetti Raphael e SVG DOM viene interrotto se $("#cont").html($("#cont").html());
viene utilizzato. La soluzione a questo non è affatto usare $("#cont").html($("#cont").html());
e invece di usare un documento SVG fittizio.
Questo SVG fittizio è innanzitutto una rappresentazione testuale del documento SVG e contiene solo gli elementi necessari. Se vogliamo ad es. per aggiungere un elemento filtro al documento Raphael, il manichino potrebbe essere qualcosa del genere <svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
. La rappresentazione testuale viene prima convertita in DOM usando il metodo $ ("body"). Append () di jQuery. E quando l'elemento (filtro) è in DOM, può essere interrogato utilizzando i metodi jQuery standard e aggiunto al documento SVG principale creato da Raphael.
Perché questo manichino è necessario? Perché non aggiungere un elemento filtro rigorosamente al documento creato da Raphael? Se lo provi usando ad es. $("svg").append("<circle ... />")
, viene creato come elemento html e nulla è sullo schermo come descritto nelle risposte. Ma se viene aggiunto l'intero documento SVG, il browser gestisce automaticamente la conversione dello spazio dei nomi di tutti gli elementi nel documento SVG.
Un esempio chiarisce la tecnica:
// 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 demo completa di funzionamento di questa tecnica è qui: http://jsbin.com/ilinan/1/edit .
(Non ho (ancora) idea, perché $("#cont").html($("#cont").html());
non funziona quando si utilizza Raphael. Sarebbe un hack molto breve.)
RMB
>edit as html
sul tag html e premi invio, viene visualizzato tutto (ma tutti i listener di eventi svaniscono). Dopo aver letto questa risposta ho cambiato le mie chiamate createElement per createElementNS e ora tutto funziona!