从 javascript 更改后如何重绘 SVG(Internet Explorer 和 Edge)
How to redraw SVG after change from javascript (Internet Explorer and Edge)
有谁知道如何在更改内容后强制 IE 和 Edge display/refresh 嵌入 SVG(请参阅下面的代码)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Title</title>
<script type="text/javascript">
function onClick() {
document.getElementById('svg').innerHTML = '<circle r="50" cx="50" cy="50" fill="red" />';
}
</script>
</head>
<body>
<button type="button" onclick="onClick()" >Display red circle</button>
<svg id="svg"/>
</body>
</html>
JS:
var x = 0;
function onClick() {
var div = document.getElementById('svg');
Update(div);
}
function Update(div){
x++;
div.innerHTML = '<svg><circle r="' + x + '" cx="' + x +'" cy="' + x + '" fill="red" /></svg>';
if (x < 100)
{
setTimeout(function() {
Update(div);
}, 100);
}
console.log(div.innerHTML);
}
HTML:
<body>
<button type="button" onclick="onClick();" >Display red circle</button>
<div id="svg">
</div>
</body>
将 SVG 包装在容器中然后更新容器的内容似乎可行。
基本上,您不需要重新加载任何东西。实际上,问题是不同的。您将无法使用标准 innerHTML
方法与 SVG 交互。调用 innerHTML
后,您的 SVG 未更新。此方法仅适用于编辑 HTML 个元素。
请看这个:
update SVG dynamically
将您的标记修改为
<div id="container">
Your svg here
</div>
并添加
document.getElementById("container").innerHTML += "";
在脚本的末尾。
正如@rzelek 所提到的,如果您使用 svg.appendChild()
添加元素而不是分配给 svg.innerHTML
.
,SVG 图像将自行更新
但有一个警告:您必须在使用 document.createElementNS()
创建的元素上指定 http://www.w3.org/2000/svg
命名空间,而不是正常的 createElement()
.
示例:
const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
circle.setAttribute('r', '50');
circle.setAttribute('cx', '50');
circle.setAttribute('cy', '50');
circle.setAttribute('fill', 'red');
document.getElementById('svg').appendChild(circle);
有谁知道如何在更改内容后强制 IE 和 Edge display/refresh 嵌入 SVG(请参阅下面的代码)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Title</title>
<script type="text/javascript">
function onClick() {
document.getElementById('svg').innerHTML = '<circle r="50" cx="50" cy="50" fill="red" />';
}
</script>
</head>
<body>
<button type="button" onclick="onClick()" >Display red circle</button>
<svg id="svg"/>
</body>
</html>
JS:
var x = 0;
function onClick() {
var div = document.getElementById('svg');
Update(div);
}
function Update(div){
x++;
div.innerHTML = '<svg><circle r="' + x + '" cx="' + x +'" cy="' + x + '" fill="red" /></svg>';
if (x < 100)
{
setTimeout(function() {
Update(div);
}, 100);
}
console.log(div.innerHTML);
}
HTML:
<body>
<button type="button" onclick="onClick();" >Display red circle</button>
<div id="svg">
</div>
</body>
将 SVG 包装在容器中然后更新容器的内容似乎可行。
基本上,您不需要重新加载任何东西。实际上,问题是不同的。您将无法使用标准 innerHTML
方法与 SVG 交互。调用 innerHTML
后,您的 SVG 未更新。此方法仅适用于编辑 HTML 个元素。
请看这个: update SVG dynamically
将您的标记修改为
<div id="container">
Your svg here
</div>
并添加
document.getElementById("container").innerHTML += "";
在脚本的末尾。
正如@rzelek 所提到的,如果您使用 svg.appendChild()
添加元素而不是分配给 svg.innerHTML
.
但有一个警告:您必须在使用 document.createElementNS()
创建的元素上指定 http://www.w3.org/2000/svg
命名空间,而不是正常的 createElement()
.
示例:
const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
circle.setAttribute('r', '50');
circle.setAttribute('cx', '50');
circle.setAttribute('cy', '50');
circle.setAttribute('fill', 'red');
document.getElementById('svg').appendChild(circle);