Динамическая загрузка SVG в SVGWeb с помощью JQuery - PullRequest
9 голосов
/ 07 октября 2010

Я пытаюсь динамически отображать SVG-контент.Это содержимое хранится в виде строки в моем источнике данных.Пример строки будет выглядеть следующим образом:

<svg width="200" height="200" style="background-color:#D2B48C; margin-bottom:5px;" id="embeddedSVG">
<g id="myGroup" fill="blue" style="font-size:18px; text-anchor:middle; font-family: serif;">
<circle id="myCircle" cx="100" cy="75" r="50" stroke="firebrick" stroke-width="3" />
<text x="100" y="155">Hello World</text><text x="100" y="175">From Embedded SVG!</text>
</g></svg>

Для размещения в IE я использую SvgWeb .Моя проблема в том, что для отображения содержимого svg мне нужно обернуть его в <script type="image/svg+xml"></script> тэг.Моя проблема заключается в том, что svg асинхронно возвращается через JQuery.И, насколько мне известно, я не могу динамически написать тег «script» из JavaScript.

Как взять содержимое SVG, полученное с помощью JQuery, и динамически отобразить его?

Ответы [ 2 ]

5 голосов
/ 12 октября 2010

Нашли частичный ответ здесь и воспроизведены ниже. Обратите внимание, что этот подход заставляет вас самостоятельно создавать корневые теги и атрибуты <svg> в javascript, а не просто загружать весь документ svg, который есть в примере вашего вопроса.

Динамическое создание корневого элемента SVG аналогично прямому внедрению в веб-страницу. Вам не нужно создавать тег SCRIPT, как если бы вы непосредственно встраивали SVG при загрузке страницы:

<script type="image/svg+xml">
  <svg>
    ...
  </svg>
</script>

Вместо этого вы следуете процессу, аналогичному описанному выше:

// create SVG root element
var svg = document.createElementNS(svgns, 'svg'); // don't need to pass in 'true'
svg.setAttribute('width', '300');
svg.setAttribute('height', '300');

// create an example circle and append it to SVG root element
var circle = document.createElementNS(svgns, 'circle');
svg.appendChild(circle);

Необходимо использовать обратный вызов, чтобы узнать, когда SVG добавляется на страницу (это незначительно отклонение от стандарта). Ниже перечислены поддерживаемые способы сделать это:

svg.addEventListener('SVGLoad', function() {
  svg = this; // this will correctly refer to your SVG root
  alert('loaded!');
}, false);
// also supported:
svg.onsvgload = function() {
  alert('loaded!');
}

Теперь добавьте корень SVG в наш документ

svgweb.appendChild(svg, document.body); // note that we call svgweb.appendChild

Обратите внимание, что в приведенном выше коде мы должны использовать прослушиватель событий, чтобы знать, когда корень SVG завершает загрузку на страницу; это небольшое отклонение от стандарта, необходимого для магии SVG Web.

Родитель, которого вы прикрепляете либо к своему корню SVG, уже должен быть присоединен к реальному DOM на вашей странице (т. Е. Его нельзя отключить от страницы).

0 голосов
/ 15 июня 2011

Вы можете использовать jQuery SVG плагин Официальный сайт не работает, но поищите инструкции .

Соответствующая часть, которую вы спрашиваете, является ответом в этом разделе, я полагаю ..

загрузить (URL, настройки) эту обертку Загрузить внешний документ SVG. Обратите внимание, что браузер может не позволить вам загрузить документы с сайтов, отличных от этого оригинальной страницы. Если нет обратного звонка предоставляется и возникает ошибка, сообщение об ошибке отображается в пределах Контейнер SVG.

url (строка) - это местоположение Документ SVG или фактический SVG встроенный документ.

настройки (булево) см. Ниже или (функция) см. onLoad ниже или (объект) дополнительные настройки для загрузить с атрибутами ниже:

addTo (логическое, необязательное) true to добавить к тому, что уже есть, или ложь (по умолчанию), чтобы очистить холст first changeSize (логический, необязательный) true, чтобы размер холста изменить или false (по умолчанию) на сохранить первоначальный размер загрузки (функция, необязательно) обратный вызов после документ загружен, эта функция получает объект-оболочку SVG и необязательное сообщение об ошибке в качестве параметров, и внутри которого это SVG контейнерное подразделение.

svg.load('images/rect01.svg',
    {addTo: true, onLoad: loadDone});
svg.load('<svg ...>...</svg>', loadDone);

также, для удовольствия, вот некоторый PHP-код, который я использовал для вставки такого SVG в оператор цикла, чтобы работал хорошо ..

if (ICON_FILE_EXT == "svg") {
        print   "\<script\>svg.load(\'".ICON_PATH."/directory.svg\', \{addTo\: true, onLoad\: loadDone\}\)\;\<\/script\>";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...