IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[DOM] Génération SVG : Balise invisible


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Par défaut [DOM] Génération SVG : Balise invisible
    Bonjour tlm,

    Voilà, je voudrais faire un petit jeu de gestion en svg / javascript, et j'ai un problème qui est survenu très vite et qui m'empêche de continuer.
    Je voudrais générer mes nodes directement dans javascript par des document.createElement() puis des appendChild(), mon code généré est correct mais la balise reste invisible sous firefox.

    Vous allez me dire, "Es-tu sûr que ton code est correct ?" à quoi je répondrai "Oui petit impertinent !" car j'ai recopié le code généré, collé directement dans mon image et la résultat est bien celui attendu, comme si firefox ne supportait pas la génération de balise svg à la volée.
    Cependant une chose me rassure, avec firebug je peux voir la balise générée, et elle apparaît effectivement comme une balise html cachée (avec un display: none), fx la reconnaît donc comme cachée, c'est bon signe. Et si je l'edit avec firebug toujours (sans rien modifier en fait), subitement la balise n'est plus cachée comme si firebug forçait le réaffichage de l'image.

    A noter que si l'on modifie des attributs des balises existantes, ça fonctionne sans problème, fx tolère donc les modifications à la volée... mais peut-être pas la création....

    Merci de votre attention honorables développeurs, que votre savoir éclaire la route de mon éveillement intellectuelle.

    P.S: Même problème sous safari, mais je n'ai pas encore testé sous fx3

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    il n'y a pas de raison que firefox se comporte de la sorte ...
    un bout de code nous aiderait à comprende ton souci de balise invisible ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre éclairé Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Par défaut
    Bon le code en brute ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
      function runScript() {
     
        var defaultSize = 25;
     
        var usine1 = new Usine(50, 80, defaultSize, defaultSize);
        var usine2 = new Usine(200, 150, defaultSize, defaultSize);
      }
     
      function Usine(posX, posY, sizeW, sizeH) {
     
        this.createRect = function(posX, posY, sizeW, sizeH) {
     
          var x = Math.round(posX - sizeW / 2);
          var y = Math.round(posY - sizeW / 2);
     
          rect = document.createElement('rect');
     
          rect.setAttribute('class', 'usine');
          rect.setAttribute('width', sizeW);
          rect.setAttribute('height', sizeH);
          rect.setAttribute('x', x);
          rect.setAttribute('y', y);
          rect.setAttribute('style', 'fill: white; stroke: black; stroke-width: 1px;');
     
          document.getElementById('layer01').appendChild(rect);
        }
     
        this.createRect(posX, posY, sizeW, sizeH);
     
      }
    Avec le SVG à côté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <svg
       xmlns:dc="http://purl.org/dc/elements/1.1/"
       xmlns:cc="http://web.resource.org/cc/"
       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       xmlns:svg="http://www.w3.org/2000/svg"
       xmlns="http://www.w3.org/2000/svg"
       width="600px"
       height="400px"
       xml:space="preserve"
       xmlns:xlink="http://www.w3.org/1999/xlink"
       id="wagon"
       onload="runScript();">
     
      <style type="text/css">
     
        .usine {
     
          fill: white;
          stroke: black;
          stroke-width: 1px;
        }
     
      </style>
      <script xlink:href="wagon.js" type="text/ecmascript" />
      <g id="layer01"></g>
    </svg>
    La fonction runScript() est lancé sur le onload() du document. Voici la balise 'rect' générée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <rect class="usine" width="25" height="25" x="38" y="68" style="fill: white; stroke: black; stroke-width: 1px;"/>
    Et voici le résultat visible sous firebug :


  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     rect = document.createElement('rect');
    c'estr quoi comme balise ça rect ???
    pas une balise DOM en tout cas ...

    et puis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          rect.className= 'usine';
          rect.style.width= sizeW;
          rect.style.heigh= sizeH;
          rect.x= x;
          rect.y= y;
          rect.cssText= 'fill: white; stroke: black; stroke-width: 1px;
    mais de toute façon avec une balise rect ...
    mets une balise span ou div à la place ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre éclairé Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Par défaut
    Touriste ! Relis le titre : ---> SVG !

    Et ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          rect.className= 'usine';
          rect.style.width= sizeW;
          rect.style.heigh= sizeH;
          rect.x= x;
          rect.y= y;
          rect.cssText= 'fill: white; stroke: black; stroke-width: 1px;
    En plus de ne pas être très standard à mon avis, ça ne fonctionne pas avec les svg. Comme le grand Confucius disait : "Un setAttribute(), c'est tellement plus classe !".

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Arf ... raté ...

    Ben ça voudrais dire que tu ne peux pas créer de balises svg avec DOM ... ?
    jett eun oeil par là :
    http://www.w3.org/TR/DOM-Level-2-Cor...t-binding.html

    sinon ta balise script au dessus ? elle est fermée ou pas ?
    à priori oui puisqu'il y a un + à coté ??
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre éclairé Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Par défaut
    Okay, mon enthousiasme n'a comme seul limite d'expression que la tolérance auditive de mes collègues !

    Après moultes recherches j'ai trouvé la fonction qui résout mon problème, cela venait de la création de l'objet svg qui doit se faire d'une manière particulière que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var svgns = "http://www.w3.org/2000/svg";
    rect = document.createElementNS(svgns, 'rect');
    Et voili, l'objet est correctement implémentés des méthodes et propriétés inhérentes à sa fonction et il s'affiche, beau comme un chevalier de la résurrection. Merci pour ton aide Grenouille de l'Espace.

    Daajack a dit : A+ !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Création de balise XML
    Par Shandler dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 01/06/2006, 22h49
  2. [DOM] Génération de XML tout pas beau :(
    Par scorpiwolf dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 23/05/2006, 15h49
  3. [SVG]Balise <image> et espace de noms
    Par Herode dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/05/2006, 16h05
  4. [DOM] Génération dynamique fichier xml
    Par Fabouney dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/10/2005, 09h45
  5. Réponses: 2
    Dernier message: 25/09/2005, 21h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo