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 :

eval d'une fonction


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut eval d'une fonction
    Bonjour!

    je vien de me faire un parser pour récupérer le code js d'une page que j'ai appelé via ajax seulement lors de l'évaluation du code avec eval il semble que ma fonction ne soit pas évaluée alors que l'alert que j'ai mis pour le test réussi.

    je comprend pas bien ce qui ce passe.

    si vous voulez vous pouvez aller sur
    [EDIT]http://mnj.serveftp.com/newleague/test/pageTest.php

    merci d'avance pour votre aide.

    ps: voici les bouts de codes qui sont concernés:
    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
    //pageTest.php
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <link rel="stylesheet" type="text/css" href="../design.css"/>
    <title>page de test</title>
    </head>
    <body>
    <?php include_once('class/AJAX_Class.js')?>
    <div id="centre" class="centre">
     
    </div>
    <script type="text/javascript">
       objAjax.execute({"id": "centre", "url": "test.html", "asynchronus": false});
    </script>
    </body>
    </html>
    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
    //test.html
    <script type="text/javascript">
    function click(){
       alert("coucou");
    }
    </script>
     
    <input type="button" value="bouton" onclick="click()" />
     
    toto
     
    <script type="text/javascript">
     
       alert("évalué");
     
    </script>
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    // Lorsque la requête réussit
    Ajax.prototype.onComplete = function (response)
    {
       // parser de javascript
       reponse = response;
       reponse = reponse.match(/(?:<script.*javascript.*>(?:[^<]+[\n\0\f\r]*)*<\/script>)*/gi);
       var script = "";
       for(i = 0; i < reponse.length; i++){
          if (reponse[i] != "") {
             script += reponse[i];
          }
       }
       script = script.replace(/(?:<script.*javascript.*>)|(?:<\/script>)|(?:[\n\f\0\r]*)/gi, "");
       alert(script);
       eval(script);
       // fin du parser de javascript
     
       // si il y a un objet à remplir (this.idFillObj != "")
       if (this.idFillObj != ""){
     
          // insertion de response après le innerHTML de l'objet à remplir
          if (this.append == "after") {
             document.getElementById(this.idFillObj).innerHTML = this.inner+"<br />"+response;
     
          // insertion de response avant le innerHTML de l'objet à remplir
          }else if (this.append == "before"){
             document.getElementById(this.idFillObj).innerHTML = response+"<br />"+this.inner;
     
          // response remplace le innerHTML de l'objet à remplir
          }else if (this.append == "no") {
             document.getElementById(this.idFillObj).innerHTML = response;
          }
       }
     
       // réinitialisation des variables pour éviter les conflits entre deux appels
       this.asyn = true;
       this.data = "";
       this.url = "";
       this.method = "POST";
       this.returnFormat = "txt";
       this.idFillObj = "";
       this.inner = "";
       this.append = "no";
    }

  2. #2
    Membre Expert
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Par défaut
    coupe le mot scri pt en plusieurs morceaux
    + lis la faq et la contribution pour les s cript dynamique

  3. #3
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    j'ai fait comme t'as dit mais ça change rien comme je pensait mon parseur fonctionne bien.

    nouveau code du parseur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       // parser de javascript
       reponse = response;
       reponse = reponse.match(/(?:<(?:scr)ipt.*javascript.*>(?:[^<]+[\n\0\f\r]*)*<\/(?:scr)ipt>)*/gi);
       var script = "";
       for(i = 0; i < reponse.length; i++){
          if (reponse[i] != "") {
             script += reponse[i];
          }
       }
       script = script.replace(/(?:<script.*javascript.*>)|(?:<\/script>)|(?:[\n\f\0\r]*)/gi, "");
       alert(script);
       eval(script);
       // fin du parser de javascript

  4. #4
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    bon je vien de voir que mon parser ne sert pas à grand chose vu qu'il y avait beaucoup plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var mesScripts = document.getElementById(this.idFillObj).getElementsByTagName("script");
    for (var i=0; i<mesScripts.length; i++) {
       eval(mesScripts[i].innerHTML);
    }
    mais bon ca ne change rien à mon problème qui et que la fonction click() n'est pas définie et que plus bizard quand je click sur le bouton de ma page firebug ne me sort pas d'erreurs ...

    je pige pas ...

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    Citation Envoyé par hiul dragonfel Voir le message
    la fonction click() n'est pas définie
    Ben si : celle du navigateur (onclick)
    Il ne se passe rien parce qu'elle n'est pas implémentée, c'est tout.

    Conclusion : ton script n'est toujours pas pris en compte

    A+

  6. #6
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    d'accord mais comment je fait pour l'implémenter alors ?

    si un eval marche pas c'est pas gagner.

    tu dis qu'il y a une fonction click() déjà définie ?

    je vais essayer de changer le nom de ma fonction alors ...

    je re dés que j'ai testé.

  7. #7
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    c'est juste un test pour l'instant.

    je veux transformer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function toto (arg1, arg2, ..., argN){
    //code
    }
    en


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    window['toto'] = funtion (arg1, arg2, ..., argN){
    //code
    }
    pour pouvoir instancier la fonction que j'importe correctemant.

    c'est tout ^^

    PS: le code que j'ai pour l'instant sans le tratement des fonctions JS
    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
    //pageTest.php
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <link rel="stylesheet" type="text/css" href="../design.css"/>
    <title>page de test</title>
    </head>
    <body>
    <?php include_once('class/AJAX_Class.js')?>
    <div id="centre" class="centre">
     
    </div>
    <script type="text/javascript">
       objAjax.execute({"id": "centre", "url": "test.html", "asynchronus": false});
    </script>
    </body>
    </html>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //test.html
    <script type="text/javascript">
    function test(){
       alert("coucou");
    }
    </script>
     
    <input type="button" value="bouton" onclick="test()" />
     
    <script type="text/javascript">
     
       alert("évalué");
     
    </script>
    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
    32
    33
    34
    35
    36
    // Lorsque la requête réussit
    Ajax.prototype.onComplete = function (response)
    {
     
       // si il y a un objet à remplir (this.idFillObj != "")
       if (this.idFillObj != ""){
     
          // insertion de response après le innerHTML de l'objet à remplir
          if (this.append == "after") {
             document.getElementById(this.idFillObj).innerHTML = this.inner+"<br />"+response;
     
          // insertion de response avant le innerHTML de l'objet à remplir
          }else if (this.append == "before"){
             document.getElementById(this.idFillObj).innerHTML = response+"<br />"+this.inner;
     
          // response remplace le innerHTML de l'objet à remplir
          }else if (this.append == "no") {
             document.getElementById(this.idFillObj).innerHTML = response;
          }
     
          var mesScripts = document.getElementById(this.idFillObj).getElementsByTagName("script");
          for (var i=0; i<mesScripts.length; i++) {
             eval(mesScripts[i].innerHTML);
          }
       }
     
       // réinitialisation des variables pour éviter les conflits entre deux appels
       this.asyn = true;
       this.data = "";
       this.url = "";
       this.method = "POST";
       this.returnFormat = "txt";
       this.idFillObj = "";
       this.inner = "";
       this.append = "no";
    }

  8. #8
    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 c'est là que tu espères lancer la fonction ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <input type="button" value="bouton" onclick="click()" />
     
    toto
    sans parenthèses et hors de balises script ????


    si tu declares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    window['toto'] = funtion (arg1, arg2, ..., argN){
    //code
    }
    il faut l'appeler avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto(arg1, arg2, ..., argN)
    à l'intérieur d'un script ....ou dans un evènement
    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 !

  9. #9
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    euh non ça c'est un copier coller malencontreu de mon premier post ^^
    je corrige

    Citation Envoyé par hiul dragonfel Voir le message
    c'est juste un test pour l'instant.

    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
    //pageTest.php
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <link rel="stylesheet" type="text/css" href="../design.css"/>
    <title>page de test</title>
    </head>
    <body>
    <?php include_once('class/AJAX_Class.js')?>
    <div id="centre" class="centre">
     
    </div>
    <script type="text/javascript">
       objAjax.execute({"id": "centre", "url": "test.html", "asynchronus": false});
    </script>
    </body>
    </html>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //test.html
    <script type="text/javascript">
    function test(){
       alert("coucou");
    }
    </script>
     
    <input type="button" value="bouton" onclick="test()" />
     
    <script type="text/javascript">
     
       alert("évalué");
     
    </script>
    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
    32
    33
    34
    35
    36
    // Lorsque la requête réussit
    Ajax.prototype.onComplete = function (response)
    {
     
       // si il y a un objet à remplir (this.idFillObj != "")
       if (this.idFillObj != ""){
     
          // insertion de response après le innerHTML de l'objet à remplir
          if (this.append == "after") {
             document.getElementById(this.idFillObj).innerHTML = this.inner+"<br />"+response;
     
          // insertion de response avant le innerHTML de l'objet à remplir
          }else if (this.append == "before"){
             document.getElementById(this.idFillObj).innerHTML = response+"<br />"+this.inner;
     
          // response remplace le innerHTML de l'objet à remplir
          }else if (this.append == "no") {
             document.getElementById(this.idFillObj).innerHTML = response;
          }
     
          var mesScripts = document.getElementById(this.idFillObj).getElementsByTagName("script");
          for (var i=0; i<mesScripts.length; i++) {
             eval(mesScripts[i].innerHTML);
          }
       }
     
       // réinitialisation des variables pour éviter les conflits entre deux appels
       this.asyn = true;
       this.data = "";
       this.url = "";
       this.method = "POST";
       this.returnFormat = "txt";
       this.idFillObj = "";
       this.inner = "";
       this.append = "no";
    }

  10. #10
    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 et dire que polothenki a eu le même problème récemment ...

    Je crois malheureusement qu'il est parti en congés
    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 !

  11. #11
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    je revien vous voir

    le problème ce déplace c'est la dernière ligne droite et je suis entrain de le mettre en joux pour le coup fatal

    voilà le code que j'ai pondu
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    // récupération des scripts
    var mesScripts = document.getElementById(this.idFillObj).getElementsByTagName("script");
     
    // pour chaque script
    for (var i=0; i<mesScripts.length; i++) {
     
       // on initialise la variable qui va récupérer les scripts traités
       var script = "";
     
       // si il y a des fonctions à instancier
       if(mesScripts[i].innerHTML.search(/(?:function)\s(.*)\)/gi) != -1){
     
          // on enregistre le script pour le modifier plus tard
          script = mesScripts[i].innerHTML;
     
          // on récupère les entêtes des fonctions
          var entetesFonctions = mesScripts[i].innerHTML.match(/(?:function)\s(.*)\)/gi);
     
          // on initialise la variable qui va stocker les nouvelles entêtes
          var entete = "";
     
          // pour chaque entête
          for( var j = 0; j < entetesFonctions.length; j++){
     
             // on récupère le nom de la fonction
             // on commence par enlever se qu'il y a devant le nom
             entete = entetesFonctions[j].replace(/(?:function)\s*/gi, "");
     
             // ensuite on enlève se qu'il y a après et on le stock dans
             // nomFonction
             nomFonction = entete.replace(/\(.*\)/gi, "");
     
             // puis on récupère les paramètres eventuels de la fonction
             params = entete.replace(/(?:.*\()|\)/gi, "");
     
             // on reconstruit l'entête pour que la fonction
             // soit instenciée correctement
             entete = "window['"+nomFonction+"'] = function ("+params+")";
     
             // création du model de l'entête de fonction à rechercher
             // selon le nom de la fonction
             pattern = new RegExp("(?:function)\s*"+nomFonction+"\(.*\)","gi"); 
             //                      ^== PROBLEME CA MARCHE PAS
             //                      apparament il aime pas le \( et le \)
     
             alert (script.match(pattern));
     
             // remplacement de l'entête dans le script à évaluer
             script = script.replace(pattern, entete);
             //alert(script);
          }
       }else{
          script = mesScripts[i].innerHTML;
       }
          //eval(script);
    }
    comment pourrai-je résoudre ça ?

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

Discussions similaires

  1. [PHP 5.3] eval et strrpos dans une fonction
    Par michelg77 dans le forum Langage
    Réponses: 52
    Dernier message: 12/03/2012, 15h00
  2. [PHP 5.3] eval dans une fonction
    Par michelg77 dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2012, 15h13
  3. Eval n'exécute qu'une fois une fonction
    Par Gp2mv3 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 05/09/2011, 16h10
  4. utilisation d'eval pour une fonction générique
    Par DrDam dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2008, 12h22
  5. Existe-t-il une fonction Eval() sous Delphi ?
    Par Hell dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2004, 17h45

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