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 :

IE eval et déclartion de variable à l'aide de "var "


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    dbadmin et dev web magento
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dbadmin et dev web magento

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut IE eval et déclartion de variable à l'aide de "var "
    bonjour,

    J'ai découvert un bug sur IE que je n'arrive pas à transformer pour qu'il accete la syntax correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function evaltest(){
      window.eval("var test = function(n){"+
        "alert('test '+n);"+
      "}");
      test(1);
      runtest();
    }
    function runtest(){
      test(2);
    }
    si on lance evaltest(), "test 1" s'affiche, mais après il y a une erreur, il ne connait pas la fonction test.

    le code marche très bien si on enlève le "var " devant "test" seulement ce n'est pas conforme au w3c et la majorité des framework javascript mette un "var " devant leur variable.

    cela marche aussi si on remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var test = function(n){...
    //par
    function test(n){...
    j'ai bien éssayé plusieurs méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var global = this;
    function evaltest(){
      global.eval("var test = function(n){"+
        "alert('test '+n);"+
      "}");
      test(1);
      runtest();
    }
    function runtest(){
      test(2);
    }
    j'aboutie toujours au même résultat. Il ne veut pas sortir la fonction test du corp d'éxécution dans lequel la fonction eval est appelé.

    je n'es pas réussit par contre à faire un docnode.appendChild(node) où node contient un élément de type '<script type="text/javascript">...</script>' avec à l'intérieur le contenu de mon code javascript à évaluer. docnode étant n'importe quel élément de la page.

    quelqu'un aurait une idée ????

    PS: qu'elle que soit la méthode employé, j'ai toujours réussi à faire se que je voulais avec firefox ainsi qu'opera.

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function evaltest(){  window['test'] = function(n){alert('test '+n)};
    }
    evaltest()
     
    test(1);
    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
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    ou plus tordu : utiliser l'objet Function() :
    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
     
    <html>
    <head><title></title>
     
    <script type="text/javascript">
    function test(str)
    {
      var corpsFct = "var test='hello'; alert(test+' "+str+"')";
      var fct = new Function("",corpsFct);
     
      fct();
    }
    </script>
    </head>
    <body onload="test('aaa')">
    </body>
    </html>

  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
    heu le but c'est pas de faire une fonction à partir d'un string ?

    var fct => window['fct']
    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
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par SpaceFrog
    heu le but c'est pas de faire une fonction à partir d'un string ?

    var fct => window['fct']
    hum, je ne sais pas .

    J'ai cru comprendre qu'il s'agissait de créer de manière dynamique une fonction et son contenu.

  6. #6
    Membre averti
    Profil pro
    dbadmin et dev web magento
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dbadmin et dev web magento

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    Citation Envoyé par Auteur
    ou plus tordu : utiliser l'objet Function() :
    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
     
    <html>
    <head><title></title>
     
    <script type="text/javascript">
    function test(str)
    {
      var corpsFct = "var test='hello'; alert(test+' "+str+"')";
      var fct = new Function("",corpsFct);
     
      fct();
    }
    </script>
    </head>
    <body onload="test('aaa')">
    </body>
    </html>
    méthode intérressante seulement j'aimerais que le contenu (ici corpsFct) soit disponible directement dans l'object window afin de pouvoir l'appelé globalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function test(str)
    {
      var corpsFct = "var test=function(str){alert(test+' "+str+"');}";
      var fct = new Function("",corpsFct);
     
      fct();
    }
    comment à partir de ça, serait-il possible d'appeler la fonction test dans un onclick dans la page par exemple ?

  7. #7
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    euh, je dois avouer ne pas comprendre ce que tu souhaites faire

    sinon ce que te propose Spacefrog ne convient pas ?

    Dans cet exemple, le corps de la fonction est défini globalement.
    Code html : 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    <html>
    <head>
    <title></title>
     
    <script type="text/javascript">
    <!--
    var corpsFct="";
    var fct;
     
    function couleur(valeur)
    {
     corpsFct =  "objet1.style."+valeur+";";  /* ne pas oublier le ; */
     corpsFct +=  "objet2.style."+valeur+";";
     
     /* Declaration de la fonction */
     fct = new Function("objet1, objet2", corpsFct);
    }
     
    function appliquer()
    {
     var elmt1 = document.getElementById("id1");
     var elmt2 = document.getElementById("id2");
     
     /* Appel de la fonction et passage des parametres */
     fct(elmt1, elmt2);
    }
     
    //-->
    </script>
     
    </head>
     
    <body>
     
    <input type="radio" name="radio1" checked="checked" value="color='#000000'" onclick="couleur(this.value)" />Noir
    <input type="radio" name="radio1" value="color='#FF0000'" onclick="couleur(this.value)" />Rouge
    <input type="radio" name="radio1" value="color='#0000FF'" onclick="couleur(this.value)" />Bleu
    <br /><br />
    <input type="button" value="Appliquer la couleur choisie" onclick="appliquer()" />
    <br /><br />
     
    <div id="id1">Ceci est un test</div><br /><br />
    <div id="id2" style="font-style: italic">Ceci est un autre test</div>
     
    </body>
     
    </html>

  8. #8
    Membre averti
    Profil pro
    dbadmin et dev web magento
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dbadmin et dev web magento

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    en fait je veux permettre a une chaine de caractère qui est définie dans un object/function et qui, si elle été évalué définirait des variables fonctions ou objects. Et je veux réussir à caller ses variables dans un contexte globale de manière à se qu'elles soient accessible dans toutes partie de la page.

    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
     
    <html>
    <head>
    <title></title>
    <script type="text/javascript">
    <!--
    var evaltest = function () {
      var moncode = "var mafunc = function(s){ alert(s); };";
      window.eval(moncode);
    }
    //-->
    </script>
    </head>
     
    <body>
    <input type="button" value="define mafunc" onclick="evaltest();"/>
    <input type="button" value="call mafunc()" onclick="mafunc();"/>
    </body>
     
    </html>
    ici c'est un exemple, j'ai défini volontairement la variable "moncode" afin de montré qu'elle est dans une fonction que j'apel par la suite.
    Dans mon code une variable de se type pourrait se trouver dans un object XMLHttpRequest par exemple.

    Or se script ne marche pas sous IE, il ne trouve pas la fonction mafunc() après avoir lancé evaltest(), ceci du au "var " qu'il ne gère pas bien.

    Si le mot "var " est inclue devant les fonction, IE les définit dans le contexte d'éxécution du eval() (meme si ici, celui ci est théoriquement éxécuté dans l'object window ici). Ainsi on peut remarqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var evaltest = function () {
      var moncode = "var mafunc = function(s){ alert(s); };";
      window.eval(moncode);
      mafunc('mafunc calling");
    }
    cela marche correctement sur tout les navigateurs. mais sur IE la function mafunc() ne peut toujours pas etre aplé de l'extérieur de la fonction evaltest() (à cause du "var " dans la chaine moncode).

    oui je sais c'est assez compliqué à comprendre ou plutot très dure à expliqué...

    je connait la methode de Spacefrog seulement je n'est pas les moyen de savoir quelles variables ("var mavaraible = ....") sont définies dans ma chaine à évalué. Sinon je pourrait les redéfinir dans un contexte globale une par une (window['mavariable'] = .... )

    n'ésitez pas à me dire s'il y a un truc pas clair, je ne sais plus quoi éssayer...

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

Discussions similaires

  1. creer des variables à l'aide des transformations
    Par Edna24 dans le forum Informatica
    Réponses: 0
    Dernier message: 19/06/2009, 16h16
  2. Réponses: 2
    Dernier message: 07/03/2009, 19h13
  3. Récupérer une variable à l'aide d'un OnMouseOver
    Par chamalo59 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 30/10/2008, 16h48
  4. Changer le nom de variables à l'aide d'une macro
    Par cocoty dans le forum Macro
    Réponses: 4
    Dernier message: 03/07/2008, 09h12
  5. [SQL] Passer plusieurs variables à l'aide des checkbox
    Par urbalk dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/10/2006, 19h32

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