standard SVG permet d'utiliser et de référer des fichiers SVG externes.
J'ai un fichier Je voudrais également accéder à l'objet de la même cercle via JavaScript, comment puis-je faire cela?
Quel est l'équivalent JavaScript de Utilisation d'un document p> code> Je ne peux qu'accéder uniquement à SvgimageElement mais pas les objets définis à l'intérieur du SVG inclus. P> encercler.svg code> qui définit un objet cercle avec ID "The_Circle".
Dans le fichier SVG principal, je suis capable d'inclure ce cercle et de l'animer, en utilisant SVG Linking A>. P>
xlink: href = "url (#the_image) #the_circle" code>? P>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
<image
id="the_image"
x="0" y="0" width="100%" height="100%"
xlink:href="circle.svg" />
<animateTransform
xlink:href="url(#the_image)#the_circle"
attributeName="transform" attributeType="XML"
type="translate"
from="0" to="25"
dur="1s" repeatCount="indefinite"
additive="replace" fill="freeze" />
</svg>
4 Réponses :
Il semble que le "droit" de faire cela serait effectivement d'utiliser un élément "Utiliser" SVG plutôt qu'une image. La raison en est que l'interface DOM de l'élément d'utilisation SVG spécifie une propriété "INSTANCEROOT", qui vous permet d'obtenir la racine de "l'arborescence d'instance" correspondant à cet élément d'utilisation: http://www.w3.org/tr/svg/truct.html#interfacesVGuseElement
Alors, vous se retrouverait avec une solution qui ressemble à quelque chose comme ce qui suit:
cercle.svg: p> document utilise le nœud racine SVG du cercle.svg: p> malheureusement, cependant, Alors que Firefox prend en charge l'utilisation de l'élément d'utilisation avec des documents externes, il y a actuellement un bogue dans WebKit qui ne permet pas cela: https://bugs.webkit.org/show_bug.cgi?id=12499 P> En outre, Firefox ne semble pas implémenter la propriété Instanceroot pour une utilisation des éléments d'utilisation. P> Donc, il semble que vous devriez peut-être travailler autour des limitations des implémentations SVG actuelles. La façon dont je recommanderais de faire cela est d'utiliser XMLHTTPQUEST pour télécharger le document sur lequel vous souhaitez créer un lien et importer le DOM du document téléchargé dans le document de votre document hôte. Le code suivant implémente cela et fonctionne dans Firefox, Opera et Chromium: P> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" id="foo"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<script>
function fetchXML (url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onreadystatechange = function (evt) {
//Do not explicitly handle errors, those should be
//visible via console output in the browser.
if (xhr.readyState === 4) {
callback(xhr.responseXML);
}
};
xhr.send(null);
};
//fetch the document
fetchXML("http://localhost:8082/tmp/circle.svg",function(newSVGDoc){
//import it into the current DOM
var n = document.importNode(newSVGDoc.documentElement,true);
document.documentElement.appendChild(n);
var circle = document.getElementById("the_circle"); //now you have the circle
})
</script>
</svg>
Ceci est exactement ce que je cherchais! Autres tentatives pour aller chercher le SVG via XHR et l'ajouter à la DOM n'a pas réussi. Merci!
Hey Jbeard4 :) J'essayais d'utiliser votre solution pour un grand SVG (900 Ko) et maintenant la charge de code avant que le SVG soit monté et que je ne peux pas accéder au SVG. Voici le lien vers ma question Ma question Je pense que vous pouvez m'aider!
Pour compléter l'excellente solution de @ Echo-Flow avec le code dans JQuery / Coffetscript:
$.get '/assets/hexagon.svg', (svgFileData)-> svgTag = svgFileData.documentElement $('body').append(svgTag) circle = $('#the_circle')
N'oubliez pas d'importer le nœud à l'aide de document.importnode. Cela pourrait se plaindre si vous ne le faites pas.
Vous pouvez accéder à l'élément nécessaire un peu plus facilement: voir Cette image pour référence (prise sur dev.opera.com )
p> p>
Nice, mais quelle est la prise? Je suppose que cela ne fonctionne que sur SVGS inclus dans le même domaine?
Et alors? Généralement, vous souhaitez manipuler votre fichier, pas un sur un autre site.
Je prends ça pour un oui; juste bon d'être clair. Je conviens que le même domaine est très souvent le cas, rendant les autres réponses plutôt sur bons que si une solution générale n'est vraiment nécessaire.
En réalité, faire des demandes Ajax à un autre domaine fait face au même problème, à moins que cela ne le permet de CORS.
Malheureusement, cela ne fonctionne pas pour fichier: // code> URL non plus. Plutôt ennuyeux.
Voici une solution à ce problème lors de l'utilisation de React et ES6. Utilisation:
Publié la même question chez SVG-Developers Tech.Groups.yahoo.com/ Groupe / SVG-Développeurs / Message / 63940