JavaScript DOM API のXMLSerializerを使用して、SVG 要素をその代表的なマークアップに変換しようとしています。
これは、要素を作成してシリアル化するために使用される基本的なコードです。
var el = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
el.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
el.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
var markup = (new XMLSerializer()).serializeToString(el);
console.log(markup);
Chrome、Firefox、Safari、Opera では、必要なものが生成されます。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
しかし、Internet Explorer 9 から IE11 では、次のようになります。
<svg xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xml:NS1="" NS1:xmlns:xlink="http://www.w3.org/1999/xlink" />
IE の出力には 2 つの問題があります。
xmlns
属性が重複しています。JavaScript の 2 行目を省略した場合、IE ではマークアップに属性が 1 つしかありませんxmlns
が、Firefox、Chrome、Safari、Opera では属性がありません。- 追加します
xml:NS1=""
。どうしてこれなの?NS1:
属性の前に付けられxmlns:xlink
ます。
属性を正しい方法で作成していると思います。たとえば、setAttribute
代わりに使用することsetAttributeNS
はここでは正しい (詳細) であり、これを変更しても問題は解決しないようです。
任意の洞察をいただければ幸いです。
編集:関連する問題では、名前空間の省略につながる Chrome のシリアル化のバグについて説明しています。最初の問題には部分的に関連しますが (他のすべてのブラウザーは同じように動作します)、2 番目の問題には関連しません。