【问题标题】:Getting attribute of a path获取路径的属性
【发布时间】:2015-10-28 02:55:42
【问题描述】:

我正在尝试访问在Javascript 中创建的路径的d 属性。打印路径元素的结果是:

path class=​"coastline"  
 d="M641.2565741281438,207.45837080935186L640.7046722156485,207.0278378856494L640.6985715873882,207.1279196729914L640.8663103175278,207.53837609537672L640.8542041922302,207.73856415298116L641.04637606029"

... 路径更长。我可以使用class 上的getAttribute 方法访问类属性。但是,当我尝试访问d 属性时,它给了我null。还有什么我应该做的吗?

编辑:这是我目前尝试访问 d 属性的方式(我特别想要海岸线):

    var path = d3.geo.path().projection(globe.projection).pointRadius(7);
    var coastline = d3.select(".coastline");
    console.log(coastline[0][0]);
    console.log(coastline[0][0].getAttribute('class'));
    console.log(coastline[0][0].getAttribute('d'));

【问题讨论】:

  • 展示您解决问题的尝试,以便我们了解您误入歧途的地方。添加一些代码。
  • 应该是简单的coastline.attr("d")。

标签: javascript d3.js svg


【解决方案1】:

d attribute of the SVGPathElement“是一个包含一系列路径描述的字符串。”

您可以通过getAttribute()/setAttribute()方法获取并设置它。
一旦被浏览器解释,路径对象将包含一个从该字符串创建的SVGPathSegList。这个SVGPathSegList 本身将包含不同的PathSegXTo 对象。

您可以通过获取路径对象的pathSegList 属性访问此列表并修改每个路径段,这是一个ArrayLike 对象,但原始字符串只能通过getAttribute 方法访问。

var p = document.createElementNS('http://www.w3.org/2000/svg', 'path');
p.setAttribute('class', 'coastline');
svg.appendChild(p);
// set the attribute
p.setAttribute('d', 'M50,25L60,105L65,65');

// move the third point on x axis after 1 second
setTimeout(function() {
  p.pathSegList[2].x += 50;

  var coastline = d3.select(".coastline");
  // get the attribute with DOM method
  snippet.log('from getAttribute : ' + coastline[0][0].getAttribute('d'));
  // get it from d3 method
  snippet.log('from d3.attr() : ' + coastline.attr('d'));
}, 1000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

<svg id="svg"></svg>

【讨论】:

  • 您只需要 NS 版本的不同命名空间中的属性,例如链接:href。对于路径上的属性,例如 d,getAttribute 和 setAttribute 工作正常。
  • 谢谢@RobertLongson,我总是对此感到困惑,NS版本的作品,所以我习惯使用它......
  • 我看到 get 属性应该是 d 属性。但是,它总是返回 null。
  • @AlexPomerenk 我编辑了答案以表明如果您的路径设置正确,那么它应该可以工作。但正如 Lars Kotthof 所指出的,如果您已经在使用 d3,那么您应该更喜欢 d3.attr() 方法而不是 DOM 方法。我确实更喜欢 pathSegList 对象而不是自己解析字符串,但这都是个人的。
【解决方案2】:

对不起!不想表达清楚,直接看下面代码

var p = document.getElementById('test');
// general attribute | property, bi-directional
console.log(p.id);// test
console.log(p.getAttribute('id'));// test

// custom attribute,  <p class='m-test' id='test' data='data'></p> and p.setAttribute('data', 'data'); one-way, only object.getAttribute() works
console.log(p.data);// undefined
console.log(p.getAttribute('data'))// data

// custom property; one-way ,only object.propery works
p.proData = 'property';

console.log(p.proData);// property
console.log(p.getAttribute('proData'));// null
<p class='m-test' id='test' data='data'>
  this is a prograph
<p/>

您可以使用 setAttribute 方法设置 'd' attribute,只有通过 getAttribute() 方法才能获取 'd' 属性的值。

【讨论】:

  • 如果您设置了一个属性属性,您可以按属性检索,反之亦然。您似乎在这里混淆了 CSS 属性和属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2014-02-13
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
相关资源
最近更新 更多