使用JavaScript更改SVG路径

hl0ma9xz  于 2023-09-29  发布在  Java
关注(0)|答案(4)|浏览(152)

下面是SVG路径:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="sss" viewBox="0 0 500 300">
  <path id="s3" d="M 10,90 Q 100,15 200,70 Z"/>
</svg>

如何更改d的值?
为什么alert(document.getElementById('s3').d);给予我undefined

eyh26e7m

eyh26e7m1#

属性可以用另一种方式设置,使用setAttribute

document.getElementById('s3').setAttribute('d', "M 10,90 Q 100,15 200,70 Z");

alert(document.getElementById('s3').getAttribute('d'));

这似乎工作。
attributes和properties是有区别的。属性的设置类似于<elem attr='value'>,属性是动态设置的。
例如,输入元素在输入内容时不会更改其属性。但是,属性会发生变化。因此.value将返回正确的结果,而.getAttribute('value')将返回value="something"设置的初始值。
在您的示例中,它是一个显式属性而不是属性。因此,.d不工作,而.getAttribute('d')工作。
http://jsfiddle.net/Kdp4v/

nkkqxpd9

nkkqxpd92#

SVGPathElement接口没有d属性:

正如其他人所说的,可以使用所有XML应用程序都可用的标准DOM 2Core方法myPath.getAttribute('d')来访问数据,将其作为一个大而难看的字符串。

  • 请注意,虽然SVG元素在SVG名称空间中,但SVG属性不在;你应该使用myPath.getAttributeNS('http://www.w3.org/2000/svg','d')。*

但是,如果希望路径数据的面向对象表示,则需要以下属性之一:

  • pathSegList
  • normalizedPathSegList
  • animatedPathSegList
  • animatedNormalizedPathSegList

所有这些属性都给予了一个SVGPathSegList,它是SVGPathSeg对象的有序列表(不是数组),可以使用numberOfItemsgetItem()枚举这些对象。
请注意,SVGPathSeg是一个基接口,它被从getItem()中获取的更具体的对象继承:

  • SVGPathSegClosePath
  • SVGPathSegMovetoAbs
  • SVGPathSegMovetoRel
  • SVGPathSegLinetoAbs
  • SVGPathSegLinetoRel
  • SVGPathSegCurvetoCubicAbs
  • SVGPathSegCurvetoCubicRel
  • SVGPathSegCurvetoQuadraticAbs
  • SVGPathSegCurvetoQuadraticRel
  • SVGPathSegArcAbs
  • SVGPathSegArcRel
  • SVGPathSegLinetoHorizontalAbs
  • SVGPathSegLinetoHorizontalRel
  • SVGPathSegLinetoVerticalAbs
  • SVGPathSegLinetoVerticalRel
  • SVGPathSegCurvetoCubicSmoothAbs
  • SVGPathSegCurvetoCubicSmoothRel
  • SVGPathSegCurvetoQuadraticSmoothAbs
  • SVGPathSegCurvetoQuadraticSmoothRel

下面是它的用法:

var segments = myPath.pathSegList;
for (var i=0,len=segments.numberOfItems;i<len;++i){
  var segment = segments.getItem(i);
  switch(segment.pathSegType){
    case SVGPathSeg.PATHSEG_LINETO_ABS:
      // segment is a SVGPathSegLinetoAbs object
      console.log( "Absolute Line To", segment.x, segment.y );
    break;
    case SVGPathSeg.PATHSEG_CLOSEPATH:
      // ...
    break;
    // see http://www.w3.org/TR/SVG11/paths.html#DOMInterfaces for constants
  }
}
deikduxw

deikduxw3#

尝试使用getAttribute()

alert(document.getElementById('s3').getAttribute("d"));
nr7wwzry

nr7wwzry4#

向有同样问题的当代人问好。我不知道2011年的情况如何,但我们现在有setAttribute来解决这些问题

document.getElementById('id').setAttribute("nameOfAttribute", "valueOfAttribute")
let foo = () => {document.getElementById('btn').setAttribute("d", "M42,2.98v43.54c0,0.54-0.71,0.98-1.59,0.98h-7.08c-0.88,0-1.59-0.44-1.59-0.98V2.98 c0-0.54,0.71-0.98,1.59-0.98h7.08C41.29,2,42,2.44,42,2.98z M18.62,2.98v43.54c0,0.54-0.71,0.98-1.59,0.98H9.96c-0.88,0-1.59-0.44-1.59-0.98V2.98C8.37,2.44,9.08,2,9.96,2 h7.08C17.91,2,18.62,2.44,18.62,2.98z")}
<style>
   svg{
   width: 25px; 
   height: 25px;
}
</style>
<svg viewBox="0 0 50 50"> 
   <path id="btn" d="M8.5,2.99v43.88c0,0.66,0.74,1.05,1.29,0.68l31.73-21.87c0.47-0.33,0.47-1.03,0-1.35L9.79,2.31 C9.25, 1.93, 8.5, 2.32, 8.5, 2.99z"/>
</svg>
<button onclick="foo()">change</button>

相关问题