The jawaban yang diterima menunjukkan terlalu rumit cara. Seperti yang Forresto klaim dalam jawabannya , " sepertinya menambahkan mereka di DOM explorer, tetapi tidak di layar " dan alasan untuk ini adalah ruang nama yang berbeda untuk html dan svg.
Solusi termudah adalah "menyegarkan" seluruh svg. Setelah menambahkan lingkaran (atau elemen lain), gunakan ini:
$("body").html($("body").html());
Ini caranya. Lingkaran ada di layar.
Atau jika Anda ingin, gunakan div wadah:
$("#cont").html($("#cont").html());
Dan bungkus svg Anda di dalam wadah:
<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>
Contoh fungsional:
http://jsbin.com/ejifab/1/edit
Keuntungan dari teknik ini:
- Anda dapat mengedit svg yang ada (yang sudah ada di DOM), mis. dibuat menggunakan Raphael atau suka dalam contoh Anda "hard coded" tanpa skrip.
- Anda dapat menambahkan struktur elemen kompleks seperti string misalnya.
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
seperti yang Anda lakukan di jQuery.
- setelah elemen ditambahkan dan dibuat terlihat di layar menggunakan
$("#cont").html($("#cont").html());
atributnya dapat diedit menggunakan jQuery.
EDIT:
Teknik di atas berfungsi dengan "kode keras" atau DOM dimanipulasi (= document.createElementNS dll.) Hanya SVG. Jika Raphael digunakan untuk membuat elemen, (menurut tes saya) hubungan antara objek Raphael dan DOM SVG rusak jika $("#cont").html($("#cont").html());
digunakan. Solusi untuk ini adalah tidak menggunakan $("#cont").html($("#cont").html());
sama sekali dan alih-alih menggunakan dokumen dummy SVG.
Dummy SVG ini merupakan representasi tekstual dari dokumen SVG dan hanya berisi elemen yang diperlukan. Jika kita ingin mis. untuk menambahkan elemen filter ke dokumen Raphael, dummy bisa berupa sesuatu <svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
. Representasi tekstual pertama kali dikonversi ke DOM menggunakan metode $ ("body"). Append () jQuery. Dan ketika elemen (filter) ada di DOM, ia dapat ditanyakan menggunakan metode jQuery standar dan ditambahkan ke dokumen SVG utama yang dibuat oleh Raphael.
Mengapa boneka ini dibutuhkan? Mengapa tidak menambahkan elemen filter secara ketat ke dokumen yang dibuat Raphael? Jika Anda mencobanya menggunakan mis. $("svg").append("<circle ... />")
, itu dibuat sebagai elemen html dan tidak ada yang ada di layar seperti yang dijelaskan dalam jawaban. Tetapi jika seluruh dokumen SVG ditambahkan, maka browser menangani secara otomatis konversi namespace dari semua elemen dalam dokumen SVG.
Contoh mencerahkan teknik:
// 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)");
Demo kerja penuh dari teknik ini ada di sini: http://jsbin.com/ilinan/1/edit .
(Saya (belum) tidak tahu, mengapa $("#cont").html($("#cont").html());
tidak bekerja saat menggunakan Raphael. Ini akan menjadi retasan yang sangat singkat.)
RMB
>edit as html
pada tag html dan tekan enter semuanya menampilkan (tetapi semua pendengar acara menghilang). Setelah membaca jawaban ini, saya mengubah panggilan createElement saya menjadi createElementNS dan sekarang semuanya berfungsi!