javascript - 更新 xlink :href for a <use> element 时,Internet Explorer 无法正确绘制 SVG

标签 javascript internet-explorer svg internet-explorer-11 xlink

https://jsfiddle.net/swoq9g3f/1/

在更改 xlink:href 后,我遇到了一个问题:在 Internet Explorer (v11.0.9600.17728) 中错误地绘制了简单的 SVG。使用 JavaScript。

如果您在 IE 中只渲染 SVG,您会得到两个同心圆。 javascript 设置xlink:href <use> 的值元素至#def1 ,这是之前的值。此后 IE 只渲染较大的圆圈,较小的圆圈隐藏在其后面。较小的圆圈位于 svg 文档的后面,这意味着它应该始终渲染在较大的圆圈之上。我还添加了一些对 forceRedraw() 的调用,但他们未能纠正问题。

Chrome 或 Firefox 中不会出现此问题。是什么原因造成的?有办法解决这个问题吗?

SVG:

<svg id="svg_element" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
  <defs>
    <svg id="def1" width="300" height="300">
      <g>
        <circle cx="150" cy="150" r="100" />
        <circle cx="150" cy="150" r="50" />
      </g>
    </svg>

    <svg id="def2">
      <use id="use_element" xlink:href="#def1" />
    </svg>
  </defs>

  <g fill="white" stroke="black" >
    <use xlink:href="#def2" />
  </g>
</svg>

Javascript:

document.getElementById("use_element").setAttributeNS('http://www.w3.org/1999/xlink','href','#def1')

document.getElementById("def1").forceRedraw()
document.getElementById("def2").forceRedraw()
document.getElementById("svg_element").forceRedraw()

最佳答案

我找到了解决该问题的方法。

https://jsfiddle.net/swoq9g3f/9/

似乎改变了 <defs> 中的内容并不总是触发完整的重新绘制,所以我必须欺骗它之后进行重新绘制。在此示例中,我发现更改了 <use><g>在 SVG 的顶层正确触发了重绘。

SVG:

<svg id="svg_element" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
  <defs>
    <svg id="def1" width="300" height="300">
      <g>
        <circle cx="150" cy="150" r="100" />
        <circle cx="150" cy="150" r="50"/>
      </g>
    </svg>

    <svg id="def2">
      <use id="use_element" xlink:href="#def1" />
    </svg>
  </defs>

  <g fill="white" stroke="black">
    <use id="use_element_2" xlink:href="#def2" />
  </g>
</svg>

Javascript:

document.getElementById("use_element").setAttributeNS('http://www.w3.org/1999/xlink','href','#def1')

document.getElementById("use_element_2").setAttributeNS('http://www.w3.org/1999/xlink','href','#def2')

关于javascript - 更新 xlink :href for a <use> element 时,Internet Explorer 无法正确绘制 SVG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30127078/

相关文章:

javascript - 如何使用 jQuery 创建滑动菜单(从右到左/从左到右)

javascript - 为什么更改 Canvas 大小会重置其参数?

javascript - 隐藏的文本区域填充在 IE 11 中不起作用

SVG 路径和变形

Clojurescript 中的 SVG

javascript - 改善背景动画颜色变化

为字符串制作自定义正则表达式驼峰式解决方案时,Javascript 出现错误结果

javascript - WordPress 模板在 IE7 上导致白色/空白屏幕,其后面带有源代码和导航

javascript - Tapestry 区域更新后,IE 中的 iFrame OnLoad 事件未触发

html - 为什么这个 SVG 可以在浏览器中以原始方式查看,但不能在网页中查看?