2013-10-26 4 views
8

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つの問題があります:

  1. xmlns属性が重複しています。 JavaScriptの2行目を省略すると、IEではマークアップにxmlnsという属性が1つしかありませんが、Firefox、Chrome、Safari、Operaでは属性がありません。
  2. xml:NS1=""を追加します。どうしてこれなの? は、xmlns:xlink属性の接頭辞です。

私は正しい方法で属性を作成していると思います。たとえば、setAttributeNSではなくsetAttributeを使用してください(more info)、これを変更しても問題は解決しないようです。

洞察力がありがとうございます。

編集:a related issueは、名前空間の省略につながるChromeのシリアル化の不具合について説明しています。最初の問題に部分的に関係しますが(他のすべてのブラウザは同じように動作します)、2番目の問題には関係ありません。

+0

setAttribute呼び出しが完全に間違っているようです。それらを完全に省略した方がうまくいきますか? –

+0

残念ながら、私はそれらを省略できません。私がした場合、結果はちょうど ''です。私は出力マークアップを.svgファイルとして保存して、そのファイルをスタンドアロンのSVGイメージとして開くことができるようにしたいと思います。 'xmlns'と' xmlns:xlink'が見つからない場合、イメージは機能しません(xlink属性はSVGと他の要素のリンクを満足させるために必要です)。 – Premasagar

+0

ブラウザの出力? SVGやXHTMLではなく、XMLSerialiserがXML文書上で実行されるときにFirefoxがネームスペースを置くのは確かですか? –

答えて

10

OK、私はそれを解決したと思います。 this postからこのWebKit bug reportまでの道に続き、これはtest caseです。

私はこれにスクリプトを変更すると、それは動作します:

var el = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); 
el.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', 'http://www.w3.org/2000/svg'); 
el.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', 'http://www.w3.org/1999/xlink'); 

var markup = (new XMLSerializer()).serializeToString(el); 
console.log(markup); 

ああ名前空間を。

しかし、Safari 6.05およびPhantomJS(bug report-現在は修正済み)にはまだ存在するWebKitの古いバージョンでは失敗します。おそらく、この修正はSafariの最新のアップデートに組み込まれている(私はまだチェックしていない)。

関連する問題