Kabul edilen cevap çok karmaşık bir yol gösteriyor. Forresto'nun iddia ettiği gibi ettiği gibi , " bunları DOM gezginine ekliyor, ancak ekrana gibi görünüyor " ve bunun nedeni html ve svg için farklı ad alanları.
En kolay çözüm, tüm svg'yi "yenilemek" tir. Daire (veya başka öğeler) ekledikten sonra şunu kullanın:
$("body").html($("body").html());
Bu hile yapar. Daire ekranda.
İsterseniz bir container div kullanın:
$("#cont").html($("#cont").html());
Ve svg konteyner div içine sarın:
<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>
İşlevsel örnek:
http://jsbin.com/ejifab/1/edit
Bu tekniğin avantajları:
- mevcut svg'yi (zaten DOM'da olan) düzenleyebilirsiniz, örn. komut dosyası olmadan örnek "sabit kodlanmış" Raphael veya benzeri kullanılarak oluşturuldu.
- Örneğin, karmaşık eleman yapılarını dize olarak ekleyebilirsiniz.
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
jQuery'de yaptığınız gibi.
- öğeler eklendikten ve ekranda görünür hale getirildikten sonra,
$("#cont").html($("#cont").html());
öznitelikleri jQuery kullanılarak düzenlenebilir.
DÜZENLE:
Yukarıdaki teknik yalnızca "sabit kodlanmış" veya DOM ile manipüle edilmiş (= document.createElementNS vb.) SVG ile çalışır. Raphael elemanlar oluşturmak için kullanılıyorsa (testlerime göre), Raphael nesneleri ile SVG DOM arasındaki bağlantı $("#cont").html($("#cont").html());
kullanılırsa kesilir . Bunun çözümü,$("#cont").html($("#cont").html());
ve bunun yerine sahte SVG belgesi kullanmaktadır.
Bu kukla SVG, ilk olarak SVG belgesinin metinsel bir temsilidir ve yalnızca gerekli öğeleri içerir. İstersek örneğin. Raphael belgesine bir filtre elemanı eklemek için, kukla gibi bir şey olabilir <svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
. Metin temsili önce jQuery'nin $ ("body"). Append () yöntemi kullanılarak DOM'a dönüştürülür. Ve (filtre) öğesi DOM'da olduğunda, standart jQuery yöntemleri kullanılarak sorgulanabilir ve Raphael tarafından oluşturulan ana SVG belgesine eklenebilir.
Neden bu kukla gerekli? Neden Raphael tarafından oluşturulan belgeye kesinlikle bir filtre öğesi eklemeyesiniz? Örneğin kullanarak denerseniz. $("svg").append("<circle ... />")
, html öğesi olarak oluşturulur ve yanıtlarda açıklandığı gibi hiçbir şey ekranda değildir. Ancak, SVG belgesinin tamamı eklenirse, tarayıcı SVG belgesindeki tüm öğelerin ad alanı dönüştürmesini otomatik olarak işler.
Bir örnek tekniği aydınlatır:
// 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)");
Bu tekniğin tam çalışma demosu burada: http://jsbin.com/ilinan/1/edit .
(Henüz bir fikrim yok, $("#cont").html($("#cont").html());
Raphael'i kullanırken neden işe yaramıyor. Çok kısa bir hack olur.)
RMB
>edit as html
html etiketi ve isabet girmek herşeyi görüntüler (ancak tüm olay dinleyicileri kaybolur). Bu yanıtı okuduktan sonra createElementNS için createElement çağrılarımı değiştirdim ve şimdi her şey çalışıyor!