【问题标题】:SVG + Javascript : how can I access elements using classes?SVG + Javascript:如何使用类访问元素?
【发布时间】:2016-01-04 15:03:53
【问题描述】:

我正在处理一个 SVG 文件,我想计算有多少多边形具有某个类(比如说“.red”)

这是简单的 javascript 循环:

var polygons = document.getElementsByTagName("polygon");
var j = 0;
for (i = 0; i < polygons.length; i++) {
  if (polygons[i].className == "red") {
    j++;
  }
};

alert("There are " + j + " red shapes")

和小提琴: https://jsfiddle.net/tuj0rmnx

我无法得到预期的结果。 返回 0 而不是 3... 想不通为什么... 我猜肯定有 DOM 问题或其他问题,但无法正确处理...

我已阅读:How to access SVG elements with Javascript 但我不想创建一个事件。最后我想要实现的就是使用 document.write() 方法在页面中自动“打印”结果......

任何帮助表示赞赏!

【问题讨论】:

  • 调试101:添加console.log(polygons[i].className);,看看得到的值。
  • 我很难找到正确的方法来执行此操作,但据我所知,SVG 内容被视为与其周围的 HTML 不同的文档。您需要查询 SVG 元素本身,以某种方式 获取其“文档”,然后在其中进行查询。这类似于您检查 iframe 的方式。
  • document.querySelector('svg polygon') 是您访问内部 svg 元素的方式。如 - “在 svg 文档中查找多边形。”

标签: javascript css svg polygon getelementsbytagname


【解决方案1】:

您可以首先选择具有正确类的元素:

var polygons = document.querySelectorAll("polygon.red");
alert("There are " + polygons.length + " red shapes")

Updated Fiddle


另一种方法是使用classList

var polygons = document.getElementsByTagName("polygon");
var j = 0;
for (i = 0; i < polygons.length; i++) {
console.log( polygons[i].className );
  if (polygons[i].classList.contains( "red" ) )  {
    j++;
  }
};
alert("There are " + j + " red shapes")

Another Fiddle


你的代码失败了,因为className 没有返回一个字符串,而是一个SVGAnimatedString,这显然不等于你的"red"

【讨论】:

  • 您好 Sirko,非常感谢您的帮助!它在 jsfiddle 中运行良好,但我现在遇到的问题是“如何访问 svg 文件中的元素”。我使用 CMS,脚本与文件分开。必须有一条指令才能从我的 SVG 文件中获取元素。有什么想法吗?
【解决方案2】:

SVG 中的属性通常与 HTML 中的同名属性具有不同的定义。

属性className 的类型不是字符串。所以你不能将它与像"red" 这样的字符串常量进行比较。它不会工作。

SVG 中属性className 的类型是AnimatedStringAnimatedString 有两个属性:

  • baseVal 包含属性的初始值,并且
  • animVal 包含属性的当前值。如果当前正在为属性设置动画,则它可能与 baseVal 不同。

因此,要使您的代码正常工作,您需要将类测试更改为:

if (polygons[i].className.baseVal == "red") {

请看下面的演示:

var polygons = document.getElementsByTagName("polygon");

var j = 0;
for (i = 0; i < polygons.length; i++) {
  if (polygons[i].className.baseVal == "red") {
    j++;
  }
};

alert("There are " + j + " red shapes")
.shapes {
  fill: #b9b9b9;
  fill-opacity: 1;
  stroke: white;
  stroke-opacity: 1;
  stroke-width: 0.002;
}

.red {
  fill: red
}
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="433" height="378" preserveAspectRatio="none" version="1.1" x="0" y="0">

  <g class="shapes">

    <polygon points="35.582,121.756 0.578,61.128 35.582,0.5 105.588,0.5 
	140.592,61.128 105.588,121.756 " />
    <polygon points="181.334,121.756 146.331,61.128 181.334,0.5 251.341,0.5 
	286.345,61.128 251.341,121.756 " />
    <polygon class="red" points="327.087,121.756 292.083,61.128 327.087,0.5 397.094,0.5 
	432.098,61.128 397.094,121.756 " />
    <polygon points="35.582,377.071 0.578,316.443 35.582,255.815 
	105.588,255.815 140.592,316.443 105.588,377.071 " />
    <polygon class="red" points="181.334,377.071 146.331,316.443 181.334,255.815 
	251.341,255.815 286.345,316.443 251.341,377.071 " />
    <polygon points="327.087,377.071 292.083,316.443 327.087,255.815 
	397.094,255.815 432.098,316.443 397.094,377.071 " />
    <polygon points="111.328,249.413 76.324,188.785 111.328,128.157 
	181.334,128.157 216.338,188.785 181.334,249.413 " />
    <polygon class="red" points="257.081,249.413 222.077,188.785 257.081,128.157 
	327.087,128.157 362.091,188.785 327.087,249.413 " />
  </g>
</svg>

【讨论】:

  • 嗨,保罗,非常感谢您的解释。它让我更清楚。但是,我现在面临一个新问题......我如何访问我的 SVG 元素,知道我的 SVG 文件位于 DOM 之外的 中。我不确定我是否应该问一个新帖子,因为这是一个不同的问题......问候
  • 这个问题已经在 SO 上回答了很多次。例如,看到这个问题:stackoverflow.com/questions/2753732/…
猜你喜欢
  • 2011-02-14
  • 1970-01-01
  • 2011-08-27
  • 2021-12-10
  • 1970-01-01
  • 2010-11-29
  • 2021-04-08
  • 1970-01-01
  • 2019-05-31
相关资源
最近更新 更多