Die akzeptierte Antwort zeigt einen zu komplizierten Weg. Wie Forresto in seiner Antwort behauptet , " scheint es, sie im DOM-Explorer hinzuzufügen, aber nicht auf dem Bildschirm ", und der Grund dafür sind unterschiedliche Namespaces für HTML und SVG.
Die einfachste Problemumgehung besteht darin, das gesamte SVG zu "aktualisieren". Verwenden Sie nach dem Anhängen eines Kreises (oder anderer Elemente) Folgendes:
$("body").html($("body").html());
Das macht den Trick. Der Kreis wird auf dem Bildschirm angezeigt.
Oder wenn Sie möchten, verwenden Sie einen Container div:
$("#cont").html($("#cont").html());
Und wickeln Sie Ihre SVG in Container 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>
Das Funktionsbeispiel:
http://jsbin.com/ejifab/1/edit
Die Vorteile dieser Technik:
- Sie können vorhandene SVG-Dateien (die sich bereits in DOM befinden) bearbeiten, z. erstellt mit Raphael oder wie in Ihrem Beispiel "fest codiert" ohne Skripterstellung.
- Sie können komplexe Elementstrukturen als Zeichenfolgen hinzufügen, z.
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
wie in jQuery.
- Nachdem die Elemente angehängt und mithilfe
$("#cont").html($("#cont").html());
ihrer Attribute auf dem Bildschirm sichtbar gemacht wurden , können sie mit jQuery bearbeitet werden.
BEARBEITEN:
Die obige Technik funktioniert nur mit "hartcodiertem" oder DOM-manipuliertem (= document.createElementNS usw.) SVG. Wenn Raphael zum Erstellen von Elementen verwendet wird, wird (nach meinen Tests) die Verknüpfung zwischen Raphael-Objekten und SVG-DOM unterbrochen, wenn $("#cont").html($("#cont").html());
es verwendet wird. Die Problemumgehung besteht darin, überhaupt nicht zu verwenden $("#cont").html($("#cont").html());
und stattdessen ein Dummy-SVG-Dokument zu verwenden.
Diese Dummy-SVG ist zunächst eine Textdarstellung des SVG-Dokuments und enthält nur Elemente, die benötigt werden. Wenn wir zB wollen. Um dem Raphael-Dokument ein Filterelement hinzuzufügen, könnte der Dummy so etwas wie sein <svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
. Die Textdarstellung wird zuerst mit der Methode $ ("body"). Append () von jQuery in DOM konvertiert. Wenn sich das (Filter-) Element im DOM befindet, kann es mit Standard-jQuery-Methoden abgefragt und an das von Raphael erstellte SVG-Hauptdokument angehängt werden.
Warum wird dieser Dummy benötigt? Warum nicht ein Filterelement ausschließlich dem von Raphael erstellten Dokument hinzufügen? Wenn Sie es mit z. $("svg").append("<circle ... />")
wird es als HTML-Element erstellt und es wird nichts auf dem Bildschirm angezeigt, wie in den Antworten beschrieben. Wenn jedoch das gesamte SVG-Dokument angehängt wird, übernimmt der Browser automatisch die Namespace-Konvertierung aller Elemente im SVG-Dokument.
Ein Beispiel zur Aufklärung der Technik:
// 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)");
Die vollständige Demo dieser Technik finden Sie hier: http://jsbin.com/ilinan/1/edit .
(Ich habe (noch) keine Ahnung, warum $("#cont").html($("#cont").html());
bei Verwendung von Raphael nicht funktioniert. Es wäre ein sehr kurzer Hack.)
RMB
>edit as html
auf dem HTML-Tag drücke und die Eingabetaste drücke, wird alles angezeigt (aber alle Ereignis-Listener verschwinden). Nachdem ich diese Antwort gelesen hatte, änderte ich meine createElement-Aufrufe in createElementNS und jetzt funktioniert alles!