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:
- Istnieją zduplikowane atrybuty
xmlns
. Jeśli pominę drugą linię kodu JavaScript, to w IE jest tylko jeden atrybutxmlns
w znacznikach, ale w przeglądarce Firefox, Chrome, Safari i Opera brakuje tego atrybutu. - Dodaje
xml:NS1=""
. Dlaczego to?NS1:
jest następnie dodawany do atrybutuxmlns: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.
Wywołania setAttribute wyglądają zupełnie nie tak. Czy nie działa lepiej, jeśli całkowicie je pomijasz? –
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
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? –