IE (или, возможно, библиотека Javascript) Добавление пространства имен SVG дважды

Я изменил это и перемещаю этот комментарий наверх.

В соответствии со Stackoverflow, это может быть ошибка в некоторых основных вещах, которые никто не может исправить. Но я рассмотрю лучший метод, который вы предлагаете, в рамках нашего приложения, чтобы удалить ложный атрибут в качестве решения. Иначе было бы несправедливо.

У меня есть странность, которую я пытаюсь решить, которая сбивает с толку. Во-первых, неясно, что это IE, за исключением того, что такое поведение не происходит в Chrome или Firefox. Мы используем библиотеки диаграмм от Anychart и D3 для создания SVG на странице. Все это здорово. Приложение представляет собой приложение для печати и извлекает разрешенный css + html в отдельный div и отправляет его через REST в службу форматирования.

Проблема заключается только в IE и только с диаграммой Anychart. Если вы изучите эту страницу:

http://www.xportability.com/XEPOnline/FOTestSuite.html

И посмотрите на пример изображения № 4, вы увидите диаграмму. Используя IE и проводник DOM, вы увидите это:

Проводник DOM

Все выглядит нормально. На самом деле все хорошо, если бы это было «настоящим». Если вы в любом случае используете javascript для извлечения этого SVG (самый простой способ — скопировать HTML в Explorer DOM), вы увидите, что HTML этого элемента на самом деле:

 <svg xmlns="http://www.w3.org/2000/svg" width="800" height="600" xmlns="http://www.w3.org/2000/svg">

Даже использование document.getElementById("anychart").outerHTML в консоли возвращает этот элемент таким образом.

Обратите внимание на двойное объявление пространства имен. Ну, это проблема, поскольку это ошибка.

  • Этого не происходит ни на графике D3, ни на статическом графике. только этот график.
  • Этого не происходит ни в Chrome, ни в Firefox.
  • И что самое странное, он даже не отображается таким образом в собственном проводнике IE DOM.

Я что-то упустил здесь? Есть ли что-то еще, что заставляет IE делать это?

ПРИМЕЧАНИЕ. Я не ищу ответы, такие как применение регулярного выражения к сериализованной строке или тому подобному. Мы можем сделать это (на самом деле мы уже делаем), чтобы закрыть пустые (незакрытые) теги HTML, чтобы сделать корректный XML.

ПРИМЕЧАНИЕ 2. Я не сбрасываю со счетов тот факт, что это может существовать в используемой базовой библиотеке Anychart JS или быть ошибкой в ​​​​Internet Explorer. Он появляется только при использовании библиотеки Anychart. С ними связались для комментариев. Однако тот факт, что IE показывает только одно пространство имен в проводнике DOM, а затем два при экспорте, подозревает, что это потенциальная проблема IE. С ними также связались через их поддержку.

Итак, я понимаю, что на этот вопрос может не быть "ответа".. это может быть ошибка в другой библиотеке или в браузере.

Таким образом, эта демонстрация работает только в Chrome и Firefox на данный момент ... пока мы не взломаем это или не решим каким-либо другим способом.


person Kevin Brown    schedule 24.07.2014    source источник
comment
Можете ли вы создать скрипт с кодом, относящимся к примеру № 4, и отправить его обратно, чтобы воссоздать ошибку, чтобы было место для ее исправления?   -  person Hackerman    schedule 24.07.2014
comment
Хорошо, вот скрипка урезана. jsfiddle.net/C4vJE/1 Запустите, щелкните щелкните меня и посмотрите. IE = двойное пространство имен, другие браузеры нет. Здесь нет ничего особенного. А еще лучше используйте IE и проводник DOM и посмотрите на результат = одно имя, а не два.   -  person Kevin Brown    schedule 25.07.2014
comment
Еще одна вещь... Версия IE   -  person Hackerman    schedule 25.07.2014
comment
Использование 11. Было бы интересно, если люди увидят проблему в других версиях, чтобы прокомментировать, пожалуйста.   -  person Kevin Brown    schedule 25.07.2014
comment
Также несколько других комментариев. Неважно, какой язык я использую для извлечения содержимого HTML. Эта скрипка использует JQuery, но я использовал чистый JS, и даже если вы перейдете в IE DOM Explorer, щелкните SVG и скажете «редактировать HTML» ... вы увидите двойное пространство имен.   -  person Kevin Brown    schedule 25.07.2014
comment
Это может быть так же просто, как innerHTML метод вывода HTML, который был исправлен IE (таким образом, в любой момент ваш HTML не должен быть недействительным - что такое SVG без пространства имен). Это все еще странно, и я тоже в тупике. Я предполагаю, что если вам требуется, чтобы в вашем выводе был один атрибут, вы можете использовать removeAttribute, который удаляет правильный атрибут один. (ах, вот моя отладка проблемы: jsfiddle.net/C4vJE/2)   -  person eithed    schedule 25.07.2014
comment
@eithedog Спасибо за это. Тупик - это настоящий вопрос. И да, наше решение основано на правильном XML, который запрещает повторяющиеся атрибуты. Этот элемент ‹joe foo=bar foo=bar-or-anything-else› недействителен. У вас не может быть двух атрибутов foo. Ваше решение очень хорошее, спасибо. Нам еще предстоит реализовать окончательный обходной путь для этого, но, поскольку мы уже применяем регулярное выражение для применения закрывающих тегов img, мы могли бы также сделать это для строкового содержимого html.   -  person Kevin Brown    schedule 25.07.2014
comment
И, чтобы быть ясным @eithedog, общее приложение очищает все содержимое div, разрешает все внешние ссылки CSS, устраняет проблемы с незакрывающимися тегами и отправляет в службу, которая принимает XML и создает PDF. У нас есть таблица стилей, которая преобразует все css в XSL FO. Таким образом, он полагается на действительный XML в качестве входных данных. И два одинаковых атрибута недействительны как есть. Если бы я в любом случае добавлял их в DOM, я бы ожидал, что последний переопределит первый ... но я бы никогда не ожидал, что попрошу сериализованную версию и получу две.   -  person Kevin Brown    schedule 25.07.2014
comment
При проведении некоторых исследований это кажется связанным... ie?rq=1" title="нежелательные пространства имен в разметке svg при использовании xmlserializer в javascript с ie">stackoverflow.com/questions/19610089/   -  person Kevin Brown    schedule 25.07.2014
comment
Дополнительное примечание: пожалуйста, используйте максимальную ширину для содержимого вашего сайта. Это очень тяжело читать даже на моем ноутбуке, потому что каждое предложение натянуто на всю страницу.   -  person Zach Saucier    schedule 25.07.2014
comment
@ZachSaucier ... хорошая идея, мы сделаем это! И ... просто говорю, что вы можете нажать Print It! и (если у вас Chrome или Firefox) вы получите PDF-файл сайта. Вы делаете хорошее замечание, и мы его исправим.   -  person Kevin Brown    schedule 25.07.2014


Ответы (1)


После глубокого анализа виновником оказалась библиотека Anychart Javascript. Они исправили ошибку, и больше такого не происходит.

person Kevin Brown    schedule 01.10.2014