受け入れ答えのショーがあまりにも道を複雑。フォレストが彼の答えで主張しているように、「それはそれらをDOMエクスプローラに追加するようですが、画面上ではありません」。この理由は、htmlとsvgの名前空間が異なるためです。
最も簡単な回避策は、SVG全体を「更新」することです。サークル(または他の要素)を追加した後、これを使用します:
$("body").html($("body").html());
これでうまくいきます。円は画面上にあります。
または、必要に応じて、コンテナーdivを使用します。
$("#cont").html($("#cont").html());
そして、svgをコンテナー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>
機能例:
http //jsbin.com/ejifab/1/edit
この手法の利点:
- たとえば、すでにDOMにある既存のsvgを編集できます。スクリプトを使用せずに「ハードコード」された例でRaphaelなどを使用して作成。
- 複雑な要素構造を文字列として追加できます。
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
jQueryで行うように。
- 要素が追加され
$("#cont").html($("#cont").html());
、属性を使用して画面に表示された後は、 jQueryを使用して編集できます。
編集:
上記の手法は、「ハードコード」またはDOM操作(= document.createElementNSなど)SVGでのみ機能します。要素の作成にRaphaelが使用されている場合、(私のテストによると)RaphaelオブジェクトとSVG DOMの間のリンク$("#cont").html($("#cont").html());
は、使用されている場合は壊れています。これの回避策はまったく使用せず$("#cont").html($("#cont").html());
、代わりにダミーのSVGドキュメントを使用することです。
このダミーのSVGは、最初はSVGドキュメントのテキスト表現であり、必要な要素のみが含まれています。たとえば、Raphaelドキュメントにフィルター要素を追加する場合、ダミーはのようになります<svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
。テキスト表現は、まずjQueryの$( "body")。append()メソッドを使用してDOMに変換されます。(filter)要素がDOMにある場合、標準のjQueryメソッドを使用してクエリを実行し、Raphaelによって作成されたメインのSVGドキュメントに追加できます。
なぜこのダミーが必要なのですか?Raphaelが作成したドキュメントにフィルター要素を厳密に追加しないのはなぜですか?あなたがそれを使ってそれを試すなら $("svg").append("<circle ... />")
、html要素として作成され、回答に記載されているように画面には何も表示されません。ただし、SVGドキュメント全体が追加された場合、ブラウザはSVGドキュメント内のすべての要素の名前空間変換を自動的に処理します。
例は技術を啓発します:
// 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)");
このテクニックの完全に機能するデモはこちらです:http : //jsbin.com/ilinan/1/edit。
(私は(まだ)わから$("#cont").html($("#cont").html());
ない、なぜRaphaelを使用するときに動作しないのか。それは非常に短いハックになるだろう。)
RMB
>edit as html
Enterキーを押すと、すべてが表示されます(ただし、すべてのイベントリスナーは消えます)。この回答を読んだ後、createElement呼び出しをcreateElementNSに変更し、すべてが機能するようになりました!