2008-12-03 8 views
30

Potrzebuję edytować (używając javascript) dokumentu SVG osadzonego na stronie HTML.Jak sprawdzić, czy osadzony dokument SVG jest załadowany na stronę HTML?

Po załadowaniu SVG, uzyskuję dostęp do strony SVG i jej elementów. Ale nie jestem w stanie dowiedzieć się, czy dom SVG jest gotowy, czy nie, więc nie mogę wykonywać domyślnych akcji na SVG, gdy ładowana jest strona HTML.

Aby uzyskać dostęp do DOM SVG, używam tego kodu:

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

gdzie "wykres" jest id elementu embed.

Gdy próbuję otworzyć SVG kiedy dokument HTML jest gotowy, w ten sposób:

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

SVG jest zawsze zerowa. Po prostu muszę wiedzieć, kiedy nie jest zerowy, więc mogę zacząć nim manipulować. Czy wiesz, czy jest jakiś sposób na zrobienie tego?

+0

Usunięto osadzony znacznik – Ilya

Odpowiedz

-5

Można spróbować odpytywanie tak często.

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

Tak, to działa. Nie myślał o rozwiązaniu limitu czasu ... Dzięki człowieku. – alexmeia

+21

Ankietowanie nie jest dobrym sposobem na zrobienie tego. Zamiast tego użyj odbiornika zdarzeń "ładuj". –

+0

@ ErikDahlström "detektor zdarzeń" load 'ma problemy. – Flimm

0

Możesz przypisać funkcję obsługi zdarzenia onload do elementu w dokumencie SVG i wywołać funkcję javascript na stronie html. przeładuj mapy na SVGLoad.

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

Zdarzenie jest wywoływane w momencie, w którym środek Filmaster pełni analizowany element i jego potomków i jest gotowy do działania odpowiednio na tym elemencie

+0

Nie, nie mogę edytować dokumentu SVG. Po prostu mogę manipulować nim, gdy znajduje się na stronie internetowej. – alexmeia

22

na elemencie osadczym (np „embed”, „obiekt”, „iframe”) w dokumencie głównym dodać atrybut onload który wywołuje czynność lub dodać detektor zdarzeń w skrypcie, np embeddingElm.addEventListener('load', callbackFunction, false). Inną opcją może być słuchanie DOMContentLoaded, w zależności od tego, czego chcesz.

Możesz także dodać detektor ładunku w dokumencie głównym. jQuery(document).ready nie oznacza, że ​​wszystkie zasoby są załadowane, tylko sam dokument ma DOM gotowy do działania. Należy jednak pamiętać, że funkcja "oddzwanianie" nie zostanie wywołana, dopóki nie załaduje się wszystkich zasobów w tym dokumencie, css, javascript itp.

Jeśli użyjesz wbudowanego svg, wtedy zadziała jQuery(document).ready jednak.

W dalszej notatce warto rozważyć użycie embeddingElm.contentDocument (jeśli jest dostępna) zamiast embeddingElm.getSVGDocument().

+2

EmbeddingElm.addEventListener ("load", callbackFunction, false) nie będzie działał, jeśli osadzanie EML jest już załadowane podczas działania skryptu. DOMContentLoaded nie będzie działać, jeśli połączysz obraz w SVG (jak obraz tła). Ty (nie powinieneś) chcesz zrobić: coś podobnego do: window.onload albo, ponieważ wtedy będziesz musiał poczekać aż wszystkie zewnętrzne zasoby również zostaną pobrane (jak na przykład skrypty śledzące i reklamy) – jBoive

+0

Czy wiesz też jak wyzwolić ten detektor zdarzeń obciążenia w obiekcie SVG w teście kątowym? –

+0

W Safari, jeśli zawartość SVG jest już załadowana, 'load' nigdy nie jest wyzwalane. – Flimm

2

jQuery można powiązać ze zdarzeniem obciążenia okno Erik wymienia się:

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

Myślę, że w ten sposób dowiesz się, kiedy obiekt SVG zostanie załadowany na stronę html, ale nadal nie wiesz, czy DOM SVG jest gotowy. – alexmeia

+0

Znalazłem, że działa to, gdy osadzałem jquery w samodzielnym SVG - dziękuję! – Vadi

8

Zakładając, że SVG jest w <embed> tagu:

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

SVG obraz jest zasadniczo w pod- dokument, który będzie miał osobne wydarzenie load do zdarzenia głównego .Można jednak nasłuchiwać tego zdarzenia i obsługiwać go:

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

To jest lepsze niż odpytywanie jako jakiejkolwiek modyfikacji można zrobić z SVG nastąpi przed pierwszym malowane, co zmniejsza migotanie i CPU wysiłek poświęcony obraz.

+0

Aby pracować z JQuery na danym elemencie, należy zrobić coś takiego: var svg = $ (embed.getSVGDocument(). DocumentElement); – BasTaller

3

Zdarzenie load elementu osadzającego (np. Obiekt) byłoby moim wyborem, ale jeśli z jakiegoś powodu nie jest to realne rozwiązanie, jedynym generycznym i niezawodnym testem, jaki znalazłem dla SVG DOM ready, jest getCurrentTime metoda elementu głównego 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 */ 
} 

w W3C SVG recommendation stwierdza, że ​​getCurrentTime na SVGSVGElement:

zwraca aktualny czas w sekundach w stosunku do czasu początkowego dla bieżącego fragmentu dokumentu SVG. Jeśli funkcja getCurrentTime zostanie wywołana przed rozpoczęciem osi czasu dokumentu (na przykład przez uruchomienie skryptu w elemencie "script" przed wywołaniem zdarzenia SVGLoad dokumentu), zwracane jest 0.

9

Można użyć onload wydarzenie dla czeku.

Załóżmy some.svg jest osadzony w znaczniku obiektów:

<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"); 
} 
+1

** Uwaga: ** Należy rozważyć użycie 'addEventListener ('load', handler)' zamiast ustawiania właściwości 'onload', aby nie przesłonić innych procedur ładujących. Nie jest to jednak obsługiwane przez starożytne przeglądarki. ** Pytanie: ** 'load' jQuery było pierwszą metodą, której próbowałem użyć, ale bez' 'image/svg + xml'' jako pierwszego argumentu nie zadziała. Czy możesz wyjaśnić tę magię?Nie mogłem znaleźć wyjaśnienia w dokumentacji jQuery. Po prostu wspomina o argumencie jako 'url' (i tutaj podajemy typ MIME). I znowu, dlaczego nie potrzebujemy czegoś takiego dla 'onload'? – Neon

+0

Myślę, że można bezpiecznie powiedzieć, że jeśli zakładasz, że przeglądarka jest w stanie wyświetlać osadzone SVG, możesz być pewien, że implementuje również 'addEventListener'. – Niavlys

+1

'svgholder.load (" image/svg + xml ", function() ...' wydaje się wywoływać ładowanie ajax jquery Zamiast wcześniejszych v3.0, jquery ustalił, które obciążenie wywołać na podstawie dostarczonych argumentów. ciąg w pierwszym argumencie, jquery próbuje zrobić GET dla "image/svg + xml" jako adresu URL, ponieważ umieszcza załadowaną zawartość w wybranym elemencie, a następnie wywołuje podaną funkcję zwrotną, może to wyglądać na załadowane powiadomienie, ale robi coś innego.Spójrz na 404 w konsoli. Ponadto obsługa zdarzeń .load jest przestarzała od wersji 3.0. – Mnebuerquo

Powiązane problemy