我在HTML页面中有一部分JavaScript表示:
function flashElements() {
var svg = document.getElementById("mysvg").getSVGDocument();
var all = svg.getElementsByTagName("flash");
for (var i=0, max=all.length; i < max; i++) {
if (all[i].flash === "on")
{
all[i].setAttributeNS(null, "fill", "lime");
}
}
}
加载SVG如下:
<object data="alpha.svg" type="image/svg+xml" id="mysvg" width="800" height="600"></object>
这个想法是在特定的触发器上调用它,如果任何SVG元素具有“flash”的特定属性,那么它们的fill属性将改变颜色。当然,上面的方法不起作用 - 它正在寻找元素,而不是属性。那么如何遍历所有SVG元素,寻找具有该特定属性的任何内容?
SVG有:
<polygon points="203,20 209,32 205,32 203,28" class="trackPlain" flash="on" />
<polygon points="205,32 209,32 217,48 213,48" class="trackPlain" flash="off" />
实际上我想做的就是闪现元素(开/关),但IE当然不支持动画。
答案 0 :(得分:3)
效率不高,但我想你可以这样做:
var allElements = svg.getElementsByTagName("*");
for(var i = 0; i < allElements.length; i++) {
var element = allElements[i];
if(element.getAttribute("myAttr") === "on") {
element.setAttribute("fill", "lime");
}
}
你的另一个选择是进行树遍历。
答案 1 :(得分:2)
另一种解决方案是使用CSS选择器,避免更改大量属性,效果应该相同。
<style>
.trackplain[flash="on"] { fill: lime; }
</style>
更新:要明确,上面应该放在svg文档中。
答案 2 :(得分:0)
使用Typescript&amp; amp;的其他答案inskscape svg:
this.mySvg = svg.getElementsByTagName("svg")[0];
let myDom = this.svg.getElementsByTagName("*");
for(let i=0; i < myDom.length; i++) {
let label = myDom[i].getAttribute('inkscape:label');
let style = myDom[i].getAttribute('style');
if (label && style) {
myDom[i].addEventListener("click", () => this.onClick(myDom[i], style));
}
}