使用javascript更改svg路径

Vic*_*huk 23 html javascript svg

有SVG路径:

<svg id="sss" viewBox = "0 0 500 300" version = "1.1">
 <defs>
   <path id="s3" d="M 10,90 Q 100,15 200,70 "/>
 </defs>
Run Code Online (Sandbox Code Playgroud)

如何更改d值?

为什么这alert(document.getElementById('s3').d);会给我undefined

pim*_*vdb 26

属性可以用另一种方式设置:

alert(document.getElementById('s3').getAttribute('d'));
Run Code Online (Sandbox Code Playgroud)

这似乎有效.设置使用setAttribute.

属性和属性之间存在差异.属性设置为<elem attr='value'>,属性是动态设置的.

例如,输入元素在输入内容时不会更改其属性.但是,该物业将会改变.因此.value会返回正确的结果,而.getAttribute('value')将返回设置的初始值value="something".

在您的情况下,它是一个显式属性而不是属性.因此,.d虽然.getAttribute('d')不起作用.

http://jsfiddle.net/Kdp4v/

  • 展示如何改变路径比将它们置于警报中更有用。 (3认同)

Phr*_*ogz 26

SVGPathElement接口没有d属性:

正如其他人所说,通过使用可用于所有XML应用程序的标准DOM 2 Core方法,您可以将数据作为一个丑陋的字符串进行访问myPath.getAttribute('d').

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

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

所有这些属性都为您提供了一个SVGPathSegList,SVGPathSeg您可以使用numberOfItems和枚举的对象的有序列表(不是数组)getItem().

请注意,这SVGPathSeg是您从更具体的对象继承的基本接口getItem():

以下是使用情况:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚意识到这使用了不推荐使用的接口,并且不再有效。请参阅 http://stackoverflow.com/questions/34352624/alternative-for-deprecated-svg-pathseglist,特别是“将会有一个新的 API https://svgwg.org/specs/paths/#InterfaceSVGPathData 和一个 polyfill https://github.com/jarek-foksa/path-data-polyfill.js 以及旧 API 的 polyfill https://github.com/progers/pathseg 另请参阅官方铬错误 https:// code.google.com/p/chromium/issues/detail?id=539385" (2认同)