実用的なソリューション
主な問題は、innerHTML
SVG要素に属性がなく、すべてのサブノードを自分で作成する必要があることです。tspan
ただし、この文字列のみを使用して一時DOMオブジェクトを作成することにより、HTML文字列をスタイル付きの(文字列解析なしの)文字列解析マジックに変換できます。その後、d3を使用して正しいtspans要素を作成できます。
var text = d3.select("#test"), tmp = document.createElement("text"); //create tmp
tmp.innerHTML = 'aaa <tspan style="font-weight:bold">bbb</tspan> ccc' //create HTML children (not yet an SVG!)
var nodes = Array.prototype.slice.call(tmp.childNodes) //create a real array from the childNodes variable
nodes.forEach( function(node) {
text.append("tspan")
.attr("style", node.getAttribute && node.getAttribute("style"))
.text(node.textContent)
})
残りの問題:childNodes
このソリューションは、ソース要素をトラバースし、サブノードと新しいサブ要素(および他のタグ)から対応する親に(およびstyle
他のプロパティ)をコピーする必要があるtspansのサブノードをサポートしていませんtspans(または他のタグ)。これにより、最終的にはサブtspan互換のパーサーが作成され、ケースが完全に解決されます。append
tspan
編集:サブノードも処理できる、より一般的なinnerSVGシムがあります。
壊れたソリューション
動作するはずなのに現在壊れている他の解決策がいくつかあります。他の人がすでに指摘している.html()
ように、jQueryまたはd3で直接使用することは、に依存しているため機能しませんinnerHTML
。
//not working
$("#test").html(...); d3.select("#test").html(...)
jQueryを介したコピーと追加(私の作業ソリューションと同様)も壊れています。正しいDOMが作成されますが、tspanは表示されません(FirefoxとChromeで試してみました)。
//creates correct DOM, but disables/hides the created tspan
var tmp = $("<text>")
tmp.html('aaa <tspan style="font-weight:bold">bbb</tspan> ccc')
$("#test").append( Array.prototype.slice.call(tmp[0].childNodes) )
W3C仕様によれば、tspanとTextNodeを混在させることが可能であるはずです。