假设这样:
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("svg").append('<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>');
});
</script>
</head>
<body>
<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>
</body>
为什么我什么都没看到?
原文由 1521237 发布,翻译遵循 CC BY-SA 4.0 许可协议
当您将标记字符串传递给
$
时,它会使用浏览器的innerHTML
属性解析为<tr>
上的属性<div>
---
)。innerHTML
无法解析 SVG 或其他非 HTML 内容,即使可以,也无法判断<circle>
应该在 SVG 命名空间中。innerHTML
在 SVGElement 上不可用——它只是 HTMLElement 的属性。当前也没有innerSVG
属性或其他方式 (*) 将内容解析为 SVGElement。因此,您应该使用 DOM 样式的方法。 jQuery 不会让您轻松访问创建 SVG 元素所需的命名空间方法。实际上,jQuery 根本不是为与 SVG 一起使用而设计的,许多操作可能会失败。HTML5 承诺让您将来在纯 HTML (
text/html
) 文档中使用<svg>
而无需xmlns
。但这只是一个解析器 hack(**),SVG 内容仍然是 SVG 命名空间中的 SVGElements,而不是 HTMLElements,因此您将无法使用innerHTML
即使它们 看起来 像一部分的 HTML 文件。但是,对于今天的浏览器,您必须使用 X HTML(正确地用作
application/xhtml+xml
;使用 .xhtml 文件扩展名保存以进行本地测试)才能使 SVG 正常工作。 (无论如何,这有点有意义;SVG 是一种基于 XML 的正确标准。)这意味着您必须转义脚本块中的<
符号(或包含在 CDATA 部分中),并且包括 XHTMLxmlns
声明。例子:*:嗯,有 DOM Level 3 LS 的 parseWithContext ,但浏览器支持很差。编辑添加:但是,虽然您不能将标记注入到 SVGElement 中,但您可以使用
innerHTML
将新的 SVGElement 注入到 HTMLElement 中,然后将其传输到所需的目标。不过它可能会慢一点:**:我讨厌 HTML5 的作者似乎害怕 XML,并决心将基于 XML 的特性硬塞进 HTML 的混乱局面。 XHTML 多年前就解决了这些问题。