4 Réponses :


14
votes

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> xxx pré>

document utilise le nœud racine SVG du cercle.svg: p> xxx pré>

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>


2 commentaires

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!



1
votes

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')


1 commentaires

N'oubliez pas d'importer le nœud à l'aide de document.importnode. Cela pourrait se plaindre si vous ne le faites pas.



13
votes

Vous pouvez accéder à l'élément nécessaire un peu plus facilement: xxx

voir Cette image pour référence (prise sur dev.opera.com ) Entrez la description de l'image ici


5 commentaires

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: // URL non plus. Plutôt ennuyeux.



1
votes

Voici une solution à ce problème lors de l'utilisation de React et ES6. Utilisation: xxx

https://gist.github.com/mikkel/ 8B79A713FF06BBEC379D


0 commentaires