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 :

[AJAX] Ajax, innerHTML et fonction javascript - solution ?


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [AJAX] Ajax, innerHTML et fonction javascript - solution ?
    Bonjour,

    Nouveau membre sur le forum mais adepte des faqs de ce site depuis longtemps, je me permets de m'inscrire et de poster sur le sujet bouillant qu'est AJAX en ce moment.

    Depuis le debut de la semaine, je fais un site en AJAX pour le boulot. L'utilisation d'AJAX est plus une lubie personnelle qu'une réel nécéssité, et m'a provoqué des maux de tête considérables, en particulier a cause à cause d'un "bug" d'innerHTML que l'ont rencontre aussi bien sous IE 6 que sous Firefox 1.504 : Le javascript contenu dans l'innerHTML remplacé n'est pas exécuté. et Eval ne corrige pas ce problème car les fonction évaluées ne sont pas pour autant disponibles pour le reste de la page. J'ai désesperement essayé des choses inefficaces ou totalement complexes et farfelues (coté serveur) avant de me dire qu'il devait y avoir un moyen d'y remédier en javascript.

    j'ai trouvé ce topic qui proposait une solution qui me paraissait surdimensionnée. j'ai donc essayé d'écrire la mienne, mais je n'ai à ma disposition que IE6 firefox et opera 8.54. Ce dernier ne réagissant pas bien à ma fonction, en effet, suivant ce que je fais : soit opera n'execute pas le script, soit il l'execute 2 fois, soit il l'execute ... sans en copier le contenu !

    les commentaires, bug, corrections, optimisations et autres sont les bienvenues.

    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
     
    function innerHTMLJS(obj,content)
    {
      /* Copyleft by GourouLubrik 2006 */
      if(typeof(obj) != 'object' && typeof(content) != 'string') return;
      obj.innerHTML = content;
     
      var scripts = obj.getElementsByTagName('script');
      if(scripts == false) return true; // no node script == no problem !
      for (var i=0;i<scripts.length;i++)
      {
        var scriptclone = document.createElement('script');
        if(scripts[i].attributes.length > 0) /* boucle de copie des attributs du script dans le nouveau node */
        {
          for (var j in scripts[i].attributes)
          {
            if(typeof(scripts[i].attributes[j]) != 'undefined'
             && typeof(scripts[i].attributes[j].nodeName) != 'undefined' /* IE needs it */
             && scripts[i].attributes[j].nodeValue != null
             && scripts[i].attributes[j].nodeValue != '' /* IE needs it ou il copie des nodes vides */) 
            {
              scriptclone.setAttribute(scripts[i].attributes[j].nodeName,scripts[i].attributes[j].nodeValue);
            }
          }
        }
        scriptclone.text = scripts[i].text; // on copie le corp du script
         /* 
             la j'ai pas compris, si je ne return pas sous opera ici : le javascript s'execute 2 fois - 
             mais la : le script s'execute mais n'est pas a ce moment la placé entre les balises scripts !
             et si je return juste après le innerHTML, le script n'est pas executé... ---o(<    
         */
        if (navigator.userAgent.indexOf("Opera")>0) { return; }
        /* on force le remplacement du node par dom, qui a pour effet de forcer le parsing du javascript */
        scripts[i].parentNode.replaceChild(scriptclone,scripts[i]); 
      }
      return true;
    }
    A propos d'ajax, pour tous les adeptes de PHP je conseille très vivement le script disponible sur http://www.hemmady.com/ajaxagent
    je ne mets pas le reste de mon contenu php/js car il se base sur cette librairie.
    Elle est absolument géniale, et la découverte de JSON est un bonheur pour convertir les objets PHP en javascript.
    PS: Ne pas oublier de str_replace("\"","\\\"") vos contenus JSON sous peine de plantage instantané de votre navigateur =).

  2. #2
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Par défaut
    Pourquoi ne pas utiliser eval ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (scriptbalise.src==null || scriptbalise.src=="" || (!scriptbalise.src)) {
       eval(scriptbalise.innerHTML);
    }
    else {
       eval(FonctionAJAXQuiRetourneLeContenuDuFichierJs(scriptbalise.src));
    }
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut eval is evil ! =p
    Bien sur, j'avais pensé a eval, mais après quelques test en situation, je me suis aperçu que les fonctions evaluées ne sont par la suite plus disponibles dans le reste de la page.

    Ces fonctions étaient utilisées dans des evenements genre onblur(); et alors que l'eval avait parfaitement fonctionné, mon evenement onblur me disait que la fonction était alors indéfinie...

    cela n'est pas toujours le cas car le script suivant fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <html><head/>
    <body>
    <script type="text/javascript">
      eval('function toto() { alert("toto"); } toto();');
    </script>
    <input type="button" value="toto()" onclick="toto();"/>
    </body></html>
    je serais curieux de savoir a partir de quel moment la fonction parsée est mémorisée ou non. =/

  4. #4
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Par défaut
    Fonction valide dans eval uniquement (selon le nav) : function Name() {}
    Fonction valide définitivement : Name = function () {}
    ex dans une balise script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <script [...]>
    MsgBox = function (text) {alert(text);};
    MsgBox("Hello");
    </script>
    ex dans un eval;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    eval("MsgBox = function (text) {alert(text);};\n
    MsgBox(\"Hello\");");
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    très interessant (et très bizarre aussi) cette différence =)
    je testouillerais ça lundi au boulot, parce que les heures sup' c'est mal =)

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut :)
    Finalement, j'ai pas attendu jusqu'a demain, et ce petit changement de définition de fonction a fait des miracles !

    Moult mercis, dommage, elle me plaisait bien ma fonction au dessus ^^.

  7. #7
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Par défaut
    De rien.
    Un détail juste...
    Si ton script comence par <!-- en HTML, ca va bloquer le eval...
    Solution proposée (non testée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s.innerHTML.replace(new RegExp(".*[^\\\"][^'][^/].*<!--", "gi"),"")
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Bonjour j'ai un problème similaire que je n'arrive pas a régler et je n'ai pas bien compris quelle était la solution proposé ici. Au final faudrait faire quoi pour que du script inséré dans une page via innerHTML soit évalué ? Merci A++

    PS: j'ai déja essayé de récupéré tout les script de la réponse ajax et ensuite ds une boucle els évaluer un par un en faisant eval() mais ca ne fonctionne pas

    A++

  9. #9
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

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

Discussions similaires

  1. [AJAX] Comment rajouter une fonction Javascript
    Par darkdrow dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/07/2007, 13h25
  2. [AJAX] Ajax et innerhtml
    Par reg11 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/09/2006, 10h33
  3. Réponses: 3
    Dernier message: 17/08/2006, 14h43
  4. [AJAX] Ajax et exécution des fonctions javascript
    Par Bobtop dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/06/2006, 15h22
  5. [AJAX] Ajax ne réactualise pas le javascript ?
    Par shadowbob dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/01/2006, 08h26

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