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 :

Insérer du code Javascript avec innerHTML.


Sujet :

JavaScript

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut Insérer du code Javascript avec innerHTML.
    Salut,

    J'ai une div qui contient des éléments mais aussi du Javascript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <div id="DIV_page">
    <script>
    function JS_showDetails() {
     //Intérieur de la fonction...
    }
    </script>
    <div>Le contenu....qui contient des tableaux et des div</div>
    </div>
    Alors si j'affiche directement ce code, ça marche. Par contre, si je l'insére à partir d'un innerHTML comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WP.get('DIV_page').innerHTML = get('DIV_page').innerHTML ;
    WP pour window.parent et get pour getElementById

    Pour pouvoir le mettre dans la page principale à partir d'une iframe, le code javascript n'est pas exécuté et je me retrouve avec des:
    Erreur*: JS_showDetails is not defined
    J'ai regardé et apparemment un innerHTML ne va pas permettre d’insérer du Javascript, ce n'est vraiment que du texte.

    Comment je peux faire ?

    merci,
    Vincent.

  2. #2
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Points : 8 040
    Points
    8 040
    Par défaut
    Bonjour,

    C'est normal, les script JS ne sont pas évalués lorsqu'ils sont insérés via innerHTML.

    Regarde dans la FAQ, un sujet traite ce genre de problème.

    Cordialement,

  3. #3
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    C'est de toute façon un erreur de conception à la base.
    Tout le js nécessaire à la page devrait etre présent au chargment.

    Mais depuis l'evolution d'ajax on voit de plsu en plus ce genre de choses ...

    avec jQuery il est possible d'aller chercher un script sur le serveur sous forme de texte et de l'intégrer à la page .

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut
    Citation Envoyé par Torgar Voir le message
    Bonjour,

    C'est normal, les script JS ne sont pas évalués lorsqu'ils sont insérés via innerHTML.

    Regarde dans la FAQ, un sujet traite ce genre de problème.

    Cordialement,
    J'ai essayé avec eval comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      var div = WP.get('DIV_page');  
      div.innerHTML = get('DIV_page').innerHTML ;
      var x = div.getElementsByTagName("script");   
      for (var i=0;i<x.length;i++) {  
          eval(x[i].text);  
      }
    Alors si j'ajoute une alert dans ma div:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <div id="DIV_page">
    <script>
    alert('Voilà alert') ;
    function JS_showDetails() {
     //Intérieur de la fonction...
    }
    </script>
    <div>Le contenu....qui contient des tableaux et des div</div>
    </div>
    Alors l'alert() va bien être éxécutée 2 fois, la première lorsqu'elle est chargée dans l'<iframe, la seconde lorsqu'elle est mise dans DIV_page de window.parent.
    Par contre, cela ne marche d'avec Firefox (ni chrome ni IE) et de toute façon je reste avec l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur*: JS_showDetails is not defined
    J'ai pas très bien compris la FAQ que tu m'as donné en lien. C'est pour de l'Ajax, non ?
    Je n'utilise pas Ajax.

    merci,
    Vincent.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut
    J'ai cherché un peu plus en profondeur et j'ai ceci qui marche:
    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
    <!doctype html>
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>test page: Using Javascript to Insert Javascript</title>
    </head>
    <body>
     
    <p>this page tests generating js code. If you see a alert box, then it means it works. (view source code)</p>
     
    <div id="DIV_js" style="display:none;">
    var i = 'ici' ;
    function hello() {
      alert('toto dit '  + i) ;
    }
    </div>
    <script>
    var ele = document.createElement("script");
    ele.type = 'text/javascript';
    ele.innerHTML= document.getElementById("DIV_js").innerHTML ;
     
    document.body.insertBefore(ele, (document.getElementById("DIV_js"))[0]);
     
    </script>
     
    <p onClick="hello();">Back toAsynchronous Javascript; Using Javascript to Insert Javascript</p>
    </body>
    </html>
    Ca marche avec Firefox, Safari, chrome, Opera mais ça ne marche pas avec IE(7 à 9) j'ai l'erreur:
    SCRIPT5009: « hello » est indéfini

    Vous savez pourquoi ?

    merci,
    Vincent.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut
    C'est bon, IE n'aime pas ele.innerHTML il préfère le .text:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ele.text = document.getElementById("DIV_js").innerHTML ;
    Et ça marche avec IE(7 à 9) et tous les autre

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par defacta
    Et ça marche avec IE(7 à 9) et tous les autre


    Ca ne marche pas parce que ton code est correct (imagine bien que le innerHTML d'un script, ça n'a pas beaucoup de sens...) mais parce que tu appelles une fonction déjà définie dans le document...

    Que cherches-tu à faire au juste ?
    Ceci dit, je pense que tu devrais essayer d'apprendre un peu les bases de JavaScript avant de l'utiliser, notamment la notion de portée du code dans le document.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut
    Citation Envoyé par Bovino Voir le message


    Ca ne marche pas parce que ton code est correct (imagine bien que le innerHTML d'un script, ça n'a pas beaucoup de sens...) mais parce que tu appelles une fonction déjà définie dans le document...

    Que cherches-tu à faire au juste ?
    Ceci dit, je pense que tu devrais essayer d'apprendre un peu les bases de JavaScript avant de l'utiliser, notamment la notion de portée du code dans le document.
    Ben il me faut pouvoir dynamiquement ajouter du code JavaScript dans un window.parent.
    Ce code Javascript est généré en PHP, donc je ne peux pas insérer un .js

    Donc pour l'instant j'ai fait ça pour tester l'insertion dynamique de Javascript en javascript:
    http://boxfly.free.fr/tmp/innerjs.html

    Bon, ça marche avec tous les navigateurs et IE9 je l'ai vu fonctionné mais maintenant il ne veut plus faire l'alert()

  9. #9
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par defacta Voir le message
    Ben il me faut pouvoir dynamiquement ajouter du code JavaScript dans un window.parent.
    Ce code Javascript est généré en PHP, donc je ne peux pas insérer un .js

    Donc pour l'instant j'ai fait ça pour tester l'insertion dynamique de Javascript en javascript:
    http://boxfly.free.fr/tmp/innerjs.html

    Bon, ça marche avec tous les navigateurs et IE9 je l'ai vu fonctionné mais maintenant il ne veut plus faire l'alert()
    Non mais c'est ta conception qui est mauvaise, tu ne dois pas déclarer ton javascript dans le document de manière éparse, mais bien tout déclarer dans le head par exemple.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var ele = document.createElement("script");
    ele.type = 'text/javascript';
    ele.text = document.getElementById("DIV_js").innerHTML ;
    document.head.appendChild(ele);
    ensuite tu fais :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <p onClick="hello();">Cliquer pour alert()</p>

    étant donné que tu définis ta fonction "hello" dynamiquement (enfin, en théorie, quand tu le feras à partir de ton iframe, pour l'instant elle est définie à un moment obscure lors de la création de la page) il est normal que cette ligne n'attache aucune fonction à l’évènement onclick de ta balise <p>. (puisque la fonction hello n'existe probablement pas encore lorsque tu essayes de la rattacher. )


    edit: enfin (document.getElementById("DIV_js"))[0] getElementById renvoit un objet et non une collection d'objet, la question est alors comment se fait-il que ton code fonctionne sur les autres navigateurs ? (à mon avis insertBefore recevant un élément ne lui appartenant pas (undefined) insert le nouvel objet en premier child par défaut sur la plupart des navigateurs)

  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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Ben il me faut pouvoir dynamiquement ajouter du code JavaScript dans un window.parent.
    C'est une erreur de conception !
    Si le but est d'injecter du js dans une page qui ne t'appartient pas tu te heurtera à la SOP.
    Sinon le js devra être sur la page avant.

  11. #11
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    C'est une erreur de conception !
    Si le but est d'injecter du js dans une page qui ne t'appartient pas tu te heurtera à la SOP.
    Sinon le js devra être sur la page avant.
    Je pense qu'il essaye de faire du pseudo ajax en se servant d'une iframe.

    C'est vrai que lorsqu'on débute, c'est plus simple de créer 2 page html, plutôt que de n'en créer qu'une seule avec des modifications du dom suite à des requêtes ajax.


    Donc on peut bien concevoir qu'il utilise du javascript reçu dans sa page "enfant" pour la page parente. Mais la pratique "d'envoyer" du code d'une page à l'autre est discutable, une bonne pratique serait simplement de "l'utiliser".


    S'il veut ajouter un événement onclick sur la page "parente" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.parent.document.getElementById('azdz').onclick = maFonction;

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut
    Je dis simplement que cet exemple:
    http://boxfly.free.fr/tmp/innerjs.html
    marche avec TOUS les navigateurs mais pas avec IE et bizarrement IE l'a fait fonctionné mais qu'une seule fois !
    Après c'est pas une question d'Ajax, d'iframe ou autre...

    Et puis il ne faut pas être anti-iframe, c'est beaucoup utilisé, même par les sites réputés modernes comme twitter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    U.innerHTML='<iframe tabindex="-1" role="presentation" style="position:absolute;top:-9999px;" src="'+R+'"></iframe>'
    Edit: Cette fois ça marche avec eval, j'ai mis à jour le fichier:
    http://boxfly.free.fr/tmp/innerjs.html

  13. #13
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par defacta Voir le message
    Et puis il ne faut pas être anti-iframe, c'est beaucoup utilisé, même par les sites réputés modernes comme twitter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    U.innerHTML='<iframe tabindex="-1" role="presentation" style="position:absolute;top:-9999px;" src="'+R+'"></iframe>'
    là, laisse-moi ne pas être d'accord.

    Oui, une bonne partie des sites connus utilises des iframes, mais pas en tant que tel. Ils les utilisent quasi uniquement pour palier à des problèmes, un peu comme des hacks.

    Les 2 cas le plus courant sont :

    - poster un formulaire dynamiquement sans raffraichir la page lorsque l'ajax ne le permet pas. (ex: les input de type "file" ou bien pour le cross-domain.)

    - gérer l'historique pour un site ajax.


    Ils sont parfois aussi utilisé pour exporter une vidéo (plutôt que d'utiliser les balises objets, à mon avis pour gérer la compatibilité) ou une pubs (pour protéger le code graçe aux interdictions d'accès des page "cross-domain").

  14. #14
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    même par les sites réputés modernes comme twitter:
    Passe le code de twitter au validateur w3c et redis moi que c'est un site "moderne"

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

Discussions similaires

  1. integrer code javascript avec jsp
    Par sas1986 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/07/2011, 18h49
  2. code javascript avec mozilla firefox
    Par jesslegende dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/02/2011, 15h35
  3. Code javaScript avec IExplorer OU FireFox
    Par fatenatwork dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/03/2008, 14h02
  4. Code javaScript avec IExplorer OU FireFox
    Par fatenatwork dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 11/03/2008, 14h50

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