Как проверить, загружен ли встроенный SVG-документ на html-страницу?

Мне нужно отредактировать (используя javascript) документ SVG, встроенный в страницу html.

Когда SVG загружен, я могу получить доступ к внутреннему пространству SVG и его элементам. Но я не могу знать, готов ли дом SVG или нет, поэтому я не могу выполнять действия по умолчанию для SVG при загрузке страницы html.

Для доступа к SVG dom я использую этот код:

var svg = document.getElementById("chart").getSVGDocument();

где «диаграмма» - это идентификатор встроенного элемента.

Если я попытаюсь получить доступ к SVG, когда HTML-документ будет готов, следующим образом:

jQuery(document).ready( function() {
var svg = document.getElementById("chart").getSVGDocument();
...

svg всегда имеет значение null. Мне просто нужно знать, когда он не равен нулю, чтобы я мог начать манипулировать им. Вы знаете, есть ли способ это сделать?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
40
0
41 448
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Вы можете назначить обработчик события onload элементу в вашем документе SVG и заставить его вызывать функцию javascript на странице html. onload отображает SVGLoad.

http://www.w3.org/TR/SVG11/interact.html#LoadEvent

The event is triggered at the point at which the user agent has fully parsed the element and its descendants and is ready to act appropriately upon that element

Нет, я не могу редактировать документ SVG. Я просто могу манипулировать им, когда он находится на веб-странице.

alexmeia 03.12.2008 17:40

Загрузка родительского элемента не сработает, только фактический файл svg.

gunslingor 22.11.2018 04:40
Ответ принят как подходящий

Вы можете попробовать опрашивать время от времени.

function checkReady() {
    var svg = document.getElementById("chart").getSVGDocument();
    if (svg == null) {
        setTimeout("checkReady()", 300);
    } else {
        ...
    }
}

Да, это работает. Не думал о решении тайм-аута ... Спасибо, чувак.

alexmeia 03.12.2008 18:15

Опрос - не лучший способ сделать это. Вместо этого используйте прослушиватель событий load.

Erik Dahlström 18.08.2010 13:09

У прослушивателя событий @ ErikDahlström load есть проблемы.

Flimm 17.10.2017 16:26

В вашем элементе внедрения (например, 'embed', 'object', 'iframe') в основном документе добавьте атрибут onload, который вызывает вашу функцию, или добавьте прослушиватель событий в скрипт, например embeddingElm.addEventListener('load', callbackFunction, false). Другой вариант - прослушивание DOMContentLoaded, в зависимости от того, для чего вы этого хотите.

Вы также можете добавить прослушиватель нагрузки в основной документ. jQuery(document).ready не означает, что все ресурсы загружены, просто документ имеет DOM, готовый к действию. Однако обратите внимание, что если вы прослушиваете загрузку всего документа, ваша функция обратного вызова не будет вызываться до тех пор, пока не будут загружены все ресурсы в этом документе, css, javascript и т. д.

Однако если вы используете встроенный svg, то jQuery(document).ready будет работать нормально.

В качестве дополнительной заметки вы можете рассмотреть возможность использования embeddingElm.contentDocument (если есть) вместо embeddingElm.getSVGDocument().

embeddingElm.addEventListener ('load', callbackFunction, false) не будет работать, если embeddingElm уже загружен при запуске скрипта. DOMContentLoaded не будет работать, если вы свяжете изображение в SVG (например, фоновое изображение). Вы (не должны) делать: что-то похожее на: window.onload, потому что тогда вам придется подождать, пока все ваши внешние ресурсы также не будут загружены (например, скрипты отслеживания и реклама)

jBoive 12.08.2015 00:46

Вы также знаете, как запустить этот прослушиватель событий загрузки для объекта SVG в тесте Angular?

Frank van Wijk 26.08.2015 16:32

В Safari, если содержимое SVG уже загружено, load никогда не запускается.

Flimm 17.10.2017 16:44

будет ли onload работать, если кто-то изменит документ SVG, назначенный чему-то вроде DIV, который вызывает загрузку этого документа? Все это, когда мы знаем, что DOM и контент действительно загружены, чтобы можно было вызывать определенные функции ECMAscript, определенные в SVG, или запрашивать DOM, по-прежнему кажется предложением удачного / промаха в 2018 году на основе того, что я слышу от некоторых людей.

Minok 13.06.2018 22:27

Используя jQuery, вы можете привязаться к событию загрузки окна, о котором упоминает Эрик:

$(window).load(function(){
    var svg = document.getElementById("chart").getSVGDocument();
});

Я думаю, таким образом вы можете узнать, когда объект SVG загружен на страницу html, но вы все еще не знаете, готова ли DOM SVG.

alexmeia 24.11.2010 18:25

Я обнаружил, что это работает, когда встраивал jquery в автономный SVG - спасибо!

Vadim Peretokin 12.12.2013 03:25

Предполагая, что ваш SVG находится в теге <embed>:

<embed id = "embedded-image" src = "image.svg" type = "image/svg+xml" />

Изображение SVG, по сути, находится во вложенном документе, который будет иметь отдельное событие load по сравнению с событием основного document. Однако вы можете прослушать это событие и обработать его:

var embed = document.getElementById("embedded-image");
embed.addEventListener('load', function()
{
    var svg = embed.getSVGDocument();
    // Operate upon the SVG DOM here
});

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

Чтобы работать с JQuery с заданным элементом, выполните следующее: var svg = $ (embed.getSVGDocument (). DocumentElement);

BasTaller 25.01.2018 17:12

Событие загрузки элемента внедрения (например, объекта) было бы моим предпочтением, но, если по какой-то причине это не является жизнеспособным решением, единственным универсальным и надежным тестом, который я нашел для готовности SVG DOM, является метод getCurrentTime SVG корневой элемент:

var element = document.getElementById( 'elementId' );
var svgDoc = element.contentDocument;
var svgRoot = svgDoc ? svgDoc.rootElement : null;

if ( svgRoot
    && svgRoot.getCurrentTime
    && ( svgRoot.getCurrentTime() > 0 ))
{
    /* SVG DOM ready */
}

Рекомендация W3C SVG утверждает, что getCurrentTime для SVGSVGElement:

Returns the current time in seconds relative to the start time for the current SVG document fragment. If getCurrentTime is called before the document timeline has begun (for example, by script running in a ‘script’ element before the document's SVGLoad event is dispatched), then 0 is returned.

You could use an onload event for the check.

Предположим, что some.svg встроен в тег объекта:

<body>    
<object id = "svgholder" data = "some.svg" type = "image/svg+xml"></object>
</body>

JQuery

var svgholder = $('body').find("object#svgholder");

svgholder.load("image/svg+xml", function() {
    alert("some svg loaded");
});

javascript

var svgholder = document.getElementById("svgholder");

svgholder.onload = function() {
    alert("some svg loaded");
}
Примечание: Рассмотрите возможность использования addEventListener('load', handler) вместо установки свойства onload, чтобы не переопределять другие обработчики нагрузки. Однако это не поддерживается древними браузерами. Вопрос: jQuery load был первым методом, который я пытался использовать, но без 'image/svg+xml' в качестве первого аргумента он не будет работать. Вы можете объяснить эту магию? Я не нашел объяснения в документации jQuery. Он просто упоминает аргумент как url (а здесь мы указываем тип MIME). И опять же, почему нам не нужна такая штука для onload?
Neonit 13.12.2016 14:53

Я думаю, можно с уверенностью сказать, что если вы предполагаете, что браузер может отображать встроенные SVG, вы можете быть уверены, что он также реализует addEventListener.

Niavlys 11.03.2017 18:06
svgholder.load("image/svg+xml", function()..., похоже, вместо этого вызывает загрузку jquery ajax. До версии v3.0 jquery определял, какую нагрузку вызывать, на основе предоставленных аргументов. Со строкой в ​​первом аргументе jquery пытается выполнить GET для 'image / svg + xml' в качестве URL-адреса. Поскольку он помещает загруженное содержимое в выбранный элемент, а затем вызывает предоставленный обратный вызов, это может выглядеть как загруженное уведомление, но делает что-то еще. Найдите 404 в своей консоли. Кроме того, обработчик событий .load устарел с версии 3.0.
Mnebuerquo 05.04.2017 22:23

Для справки в будущем: решение Угловой (8) / Машинопись выглядит так:

  @ViewChild('startimage', {static:false})
  private startimage: ElementRef;
...
  this.startimage.nativeElement.addEventListener('load', () => {
    alert('loaded');
  });

Попасть в svg можно по const svg = this.startimage.nativeElement.getSVGDocument();

Другие вопросы по теме