该接受的答案也表示复杂的方式。正如Forresto在他的回答中声称的那样,“ 它似乎确实是在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
该技术的优点:
- 您可以编辑现有的svg(已经在DOM中),例如。使用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时不起作用。那将是很短的hack。)
RMB
>edit as html
在html标记上并按Enter,则显示所有内容(但所有事件侦听器均消失)。阅读此答案后,我将createElement调用更改为createElementNS,现在一切正常!