用js创建的svg标签对象的innerHTML问题

<!DOCTYPE html>
<html lang="en">
  <body>
    <svg id="aa"><image></image></svg>
    <script>
      const aa = document.getElementById('aa')
      const bb = document.createElement('svg')
      bb.innerHTML = aa.innerHTML

      // 为什么bb的内容是"<img>"而不是"<image></image>"
    </script>
  </body>
</html>

这串代码,为什么bb的内容是 <img> 而不是 <image></image>

阅读 4.6k
2 个回答

所有SVG的东西,用DOM接口的时候,都要去找一个NS结尾的(几乎)同名的接口,因为SVG有自己单独的命名空间,这就是为什么会有一些SVG封装库,因为每次少写个NS能省不少事……

首先,jquery是操作普通xhtml的,对应svg这种特殊的标签,或者说xml,浏览器如何区分,当然是通过命名空间:namespaceURI,比如普通html的是http://www.w3.org/1999/xhtml,而svg也有自己的命名空间:http://www.w3.org/2000/svg,jquery在操作的时候没有加以区分,因此导致了这样的错误。怎么办,使用setAttributeNS创建svg标签即可。

其次,我们创建大量标签的时候,喜欢innerHTML=template这种方式,svg也可以,应该说大部分浏览器都可以,可是有些浏览器不可以,我们就需要自己提供兼容的innerSVG方法了。

最后,关于上面说的二点,你都可以对比这个例子

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题