JavaScript DOM APIのXMLSerializerを使用して、SVG要素をその代表マークアップに変換しようとしています。IEのJavaScriptでXMLSerializerを使用しているときにSVGマークアップに不要な名前空間がある
これは、要素を作成し、それをシリアル化するために使用される基本的なコードです:クロム、Firefoxの、SafariとOperaで
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);
を、それは私が欲しいものを生成します。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
しかし、インターネットでエクスプローラ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ではマークアップにxmlns
という属性が1つしかありませんが、Firefox、Chrome、Safari、Operaでは属性がありません。xml:NS1=""
を追加します。どうしてこれなの? は、xmlns:xlink
属性の接頭辞です。
私は正しい方法で属性を作成していると思います。たとえば、setAttributeNS
ではなくsetAttribute
を使用してください(more info)、これを変更しても問題は解決しないようです。
洞察力がありがとうございます。
編集:a related issueは、名前空間の省略につながるChromeのシリアル化の不具合について説明しています。最初の問題に部分的に関係しますが(他のすべてのブラウザは同じように動作します)、2番目の問題には関係ありません。
setAttribute呼び出しが完全に間違っているようです。それらを完全に省略した方がうまくいきますか? –
残念ながら、私はそれらを省略できません。私がした場合、結果はちょうど ''です。私は出力マークアップを.svgファイルとして保存して、そのファイルをスタンドアロンのSVGイメージとして開くことができるようにしたいと思います。 'xmlns'と' xmlns:xlink'が見つからない場合、イメージは機能しません(xlink属性はSVGと他の要素のリンクを満足させるために必要です)。 – Premasagar
ブラウザの出力? SVGやXHTMLではなく、XMLSerialiserがXML文書上で実行されるときにFirefoxがネームスペースを置くのは確かですか? –