2013-10-26 26 views
8

Próbuję użyć interfejsu JavaScript DOM API XMLSerializer, aby przekonwertować element SVG do reprezentatywnego znacznika.Niepożądane przestrzenie nazw w znakach SVG przy użyciu XMLSerializer w JavaScript przy użyciu IE

Jest to kod podstawowy służy do tworzenia elementu i szeregować go:

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); 

W Chrome, Firefox, Safari i Opera, produkuje to, co chcę:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"/> 

ale w Internecie Explorer 9 do IE11, otrzymuję to:

<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" /> 

Występują dwa problemy z wyjściem IE:

  1. Istnieją zduplikowane atrybuty xmlns. Jeśli pominę drugą linię kodu JavaScript, to w IE jest tylko jeden atrybut xmlns w znacznikach, ale w przeglądarce Firefox, Chrome, Safari i Opera brakuje tego atrybutu.
  2. Dodaje xml:NS1="". Dlaczego to? NS1: jest następnie dodawany do atrybutu xmlns:xlink.

Myślę, że tworzę atrybuty we właściwy sposób. Na przykład użycie setAttribute zamiast setAttributeNS jest tutaj poprawne (more info), a zmiana tego nie rozwiązuje problemu.

Wszelkie doceniane doceny.

Edytuj: a related issue omawia błąd w serializacji Chrome, który prowadzi do pominięcia przestrzeni nazw. Częściowo istotne dla pierwszego problemu (chociaż wszystkie pozostałe przeglądarki działają tak samo), ale nie są związane z drugim problemem.

+0

Wywołania setAttribute wyglądają zupełnie nie tak. Czy nie działa lepiej, jeśli całkowicie je pomijasz? –

+0

Niestety, nie mogę ich pominąć. Jeśli tak, wynik jest po prostu ''. Chcę, aby znacznik wyjściowy był czymś, co można zapisać jako plik .svg, a następnie ten plik został otwarty jako samodzielny obraz SVG. Obraz nie będzie działał, jeśli brakuje "xmlns" i "xmlns: xlink" (atrybut xlink jest potrzebny do spełnienia linków w innych elementach z SVG: – Premasagar

+0

Dane wyjściowe z jakiej przeglądarki? Czy robisz to w dokumencie HTML zamiast na SVG lub XHTML Firefox z pewnością umieszcza przestrzenie nazw, gdy XMLSerialiser jest uruchamiany na dokumencie XML? –

Odpowiedz

10

OK, myślę, że go rozwiązałem. Następnie podążamy szlakiem od this post do tego WebKit bug report i tego test case.

Jeśli zmienić skrypt do tego, to działa:

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); 

Ah nazw.

Ale nie działa w starszej wersji WebKit, która jest nadal dostępna w Safari 6.05 i PhantomJS (bug report - teraz rozwiązana). Prawdopodobnie poprawka została włączona do najnowszej aktualizacji Safari (jeszcze nie sprawdziłem).

Powiązane problemy