Различия в использовании <iframe>и <embed>для отображения SVG и скриптов - PullRequest
7 голосов
/ 17 апреля 2011

Я пытаюсь создать динамическую SVG-графику, насколько я понимаю, что единственный способ создать динамическую SVG - это использовать язык сценариев, поэтому у меня есть несколько вопросов, в основном я хотел бы загрузить или встроить SVG на веб-страницу HTML и управлять графикой, используя входные данные на веб-странице, а не жестко кодировать скрипт ECMA в файле SVG. Я не совсем уверен, стоит ли мне использовать тег embed или iframe для отображения SVG, вот мои сомнения относительно SVG и сценариев:

  1. Какая разница (с точки зрения сценариев) в использовании тегов <iframe> или и <embed> для доступа к элементам SVG? Может быть, кто-то может привести простые примеры.
  2. Может ли SVG оценивать математические выражения в атрибутах элементов (просто чтобы быть уверенным)?

Ответы [ 3 ]

4 голосов
/ 17 апреля 2011

Не используйте <iframe> или <embed>. Вместо этого вставьте SVG прямо в XHTML, например:
http://phrogz.net/svg/svg_in_xhtml5.xhtml

При этом у вас есть полный доступ к SVG DOM как части вашего документа. Как показано в этом примере, вам просто нужно быть уверенным в создании элементов SVG (но не атрибутов) с использованием пространства имен SVG. Вы также должны убедиться, что ваш веб-хост отправляет тип контента для xhtml как application/xhtml+xml или text/xml, а не text/html.

phrogz$ curl --silent -I http://phrogz.net/svg/svg_in_xhtml5.xhtml | grep "Type"
Content-Type: application/xhtml+xml

Дополнительные примеры JavaScript-манипулирования SVG, смешанного с HTML, см. В различных файлах .xhtml в того же каталога . Особенно убедительным примером является этот , который динамически создает сотни маленьких SVG-файлов в виде встроенных элементов, похожих на текст.

И на ваш вопрос:

Может ли SVG вычислять математические выражения в атрибутах элементов (просто чтобы убедиться)?

Нет, вообще нет. Однако использование SMIL Animation позволяет указывать различные методы интерполяции свойств во времени.

Наконец, обратите внимание, что вам не нужно помещать SVG в HTML, чтобы сделать его динамичным. Вы можете написать скрипт SVG напрямую с помощью JavaScript. Например, посмотрите этот тестовый файл (нажмите зеленую кнопку, чтобы начать симуляцию):
http://phrogz.net/svg/SpringzTest.svg

1 голос
/ 17 апреля 2011

Какая разница (с точки зрения сценариев) в использовании тега or и для доступа к элементам SVG? Может быть, кто-то может включить простые примеры.

<iframe>

Сценарии, пытающиеся получить доступ к содержимому фрейма, подчиняются той же политике происхождения и не могут получить доступ к большинству свойств в другом объекте окна, если он был загружен из другого домена. Это также относится к сценарию внутри фрейма, пытающемуся получить доступ к его родительскому окну. Междоменная связь все еще может быть достигнута с помощью window.postMessage.

Источник: https://developer.mozilla.org/en/HTML/Element/iframe#Scripting

Доступ к контенту iframe осуществляется методом iframe_element.contentWindow:

<html>
  <body>
    <iframe id="SVG_frame" src="image.svg"></iframe>
  </body>
  <script>
    var SVG_frame = document.getElementById ( "SVG_frame" );
    var SVG_content = null;
    function getContent ()
    {
      SVG_content = SVG_frame.contentWindow;
      SVG_content ? alert ( "YAY!" ) : alert ( "BOO!" );
    }
      SVG_frame.onload = getContent;
  </script>
</html>

<embed>

Пример (просмотреть исходный код): https://jwatt.org/svg/demos/scripting-across-embed.html

(оба метода дают сбой хотя бы в Chromium)

<object>

Пример (просмотреть исходный код): https://jwatt.org/svg/demos/scripting-across-object.html


Может ли SVG оценивать математические выражения в атрибуты элемента (просто чтобы быть уверенным)?

как <element attribute="48/2*(9+3)"/>?

Я не нашел ни слова об этом в SVG spec .


EDIT

Лично я рекомендую использовать <object> + Схема URI данных и / или object_element.contentDocument. Я тестировал как в Chromium, так и в Firefox.

AHA! <object> имеет поведение безопасности, аналогичное <iframe>: домен, протокол должен быть одинаковым для сайта и файла SVG.


EDIT2

Если вас интересует, как заставить работать векторную графику разметки для работы в Internet Explorer (-ах) без плагинов, тогда Vector Markup Language - это способ.

0 голосов
/ 17 апреля 2011

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

Вы можете создавать интерактивный / анимированный SVG-контент с помощью декларативных элементов анимации (он же SMIL). Вы также можете создавать простые эффекты при наведении курсора на CSS: правила наведения или переходы с помощью CSS3 Transitions .

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

Вы можете получить доступ к элементам svg из файла HTML, который включает его, одним из следующих способов:

theEmbeddingElement.contentDocument (предпочтительно, но не работает на <embed>) или альтернативно theEmbeddingElement.getSVGDocument().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...