私はforeignObject
SVGで苦労しています。内にテキストを追加したいのですが、rect
自動テキストラップを取得するには、HTMLを使用することを選択しました。の説明はここforeignObject
にあります。
私はD3を使用していますが、これは私のデータです。
var cds = [
{"uid":"U12","sid":"16","statement":"Movies","x":10,"y":10},
{"uid":"U20","sid":"17","statement":"Food","x":10,"y":170},
{"uid":"U22","sid":"15","statement":"Sport","x":10,"y":330}
];
データごとにカードを追加し、データから「ステートメント」を表示したいと思います。
var cardsize = { width : 150, height : 150 };
var svg = d3.select("body").append("svg:svg")
.attr("width", 170)
.attr("height", 490);
var card = svg.selectAll("rect")
.data(cds)
.enter().append("svg:g")
.attr("class", "card")
.attr("transform", function(d,i) {
d.x = 10;
d.y = 10+i*(10+cardsize.height);
return "translate(" + d.x + "," + d.y + ")";
});
card.append("svg:rect")
.attr('width', cardsize.width)
.attr('height', cardsize.height)
card.append("svg:foreignObject")
.attr('width', cardsize.width)
.attr('height', cardsize.height)
.append('p')
.attr("class","statement")
.text(function(d) { return d.statement; });
カードの出力は次のとおりです。
<g class="card" transform="translate(10,330)">
<rect width="150" height="150"></rect>
<foreignObject width="150" height="150"><
p class="statement">Sport</p>
</foreignObject>
</g>
テストした(mac)ブラウザ(Safari 6.0.2、Chrome 25.0.1364.99、Firefox 18.0.2)でテキストが表示されません。W3のバリデーターは出力が気に入らないので、カードごとに次のエラーが表示されます。
このコンテキストでは、要素foreignObjectは要素gの子として許可されていません。
だから私の質問は、問題はどこにあり、なぜforeignObjectはg
要素の子として許可されないのですか?
また、なぜ.html(function(d) { return d.statement; });
機能しない(出力がない)のか疑問に思っています。しかし、.text(function(d) { return d.statement; });
うまくいきますか?
これがフィドルです。