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] Executer Javascript chargé par Ajax


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 419
    Points : 532
    Points
    532
    Par défaut [AJAX] Executer Javascript chargé par Ajax
    Bonjour,

    J'utilise sur un projet des div sous forme de "panel flottants". Le contenu de ceux ci est chargé "bourrinement" par ajax. C'est à dire en gros :
    maDiv.innerHTML = chaineRecupParAjax ;

    Evidemment pas de probleme pour l'html, par contre, le javascript chargé n'est pas executé.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Blablabla html tralalala
    <script type="text/javascript">
    	alert('Je suis executé !') ;
    </script>
    Normal me direz vous, mais une solution me donnerez vous ?

  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
    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
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 419
    Points : 532
    Points
    532
    Par défaut
    Merci pour cette solution, elle fonctionne à merveille ... sous FF

    Sous ie, cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var AllScripts=div.getElementsByTagName("script");
    ne retourne aucun élément.

  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
    Ca m'étonne franchement !
    Il me semble l'avoir developpé pour IE pourtant (mais bon, ptêtre que j'ai testé FF)
    Deplus, j'ai déjà conseillé le script a de nombreuses personnes qui ne m'ont jamais rien dit de tel...
    Ta page est-elle en ligne ?

    EDIT :
    As tu fais des tests simples (ex : setInnerHTML(document.getElementById("divContent"), "<script>alert('')</script>"))
    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
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 419
    Points : 532
    Points
    532
    Par défaut
    Non ce n'est pas en ligne et je ne peux pas vraiment le mettre ...

    Je vais continuer à chercher parce que je ne comprend pas non plus pourquoi ça ne fonctionne pas.

    Pour m'aider dans mes tests peux tu me dire comment récuperer le nom des tags dans les boucles de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var All=div.getElementsByTagName("*");
     
    	for (var i=0; i<All.length; i++) 
    	{

  6. #6
    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
    1) voir mon Edit
    2) Oui : item.tagName.toLowerCase()=="script"
    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

  7. #7
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 419
    Points : 532
    Points
    532
    Par défaut
    Bon voila, retour au boulot, retour des problèmes aussi

    J'ai donc fait des tests pour voir ce qui n'allait pas sous IE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var div = document.createElement('div') ;
    div.innerHTML = contenu ;
     
    alert(contenu) ;
    alert(div.innerHTML) ;
    Le premier alert m'afficher bien les balises <script>, mais celles ci disparaissent dans le 2ème

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 30
    Points : 34
    Points
    34
    Par défaut
    A mon avis, c'est peut etre parce que le code est inséré après le chargement de la page, et vu que le javascript s'exécute quand on charge une page....il n'y a aucun effet. Par contre je vois pas pourquoi il ne s'affiche pas dans ton 2eme alert...

    A la rigueur, tu peux essayer d'évaluer ton code JS avec eval()...

  9. #9
    ALkyD
    Invité(e)
    Par défaut
    Ca ne marche pas quand il y a des document.write() à l'intérieur du script... Ni sous FF ni ailleurs. Au lieu d'écrire le texte là où il y a le document.write, ça l'écrit sous une page blanche (comme en temps normal lorsque la page est déjà chargée et qu'on utilise document.write après).

  10. #10
    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
    document.write = mal
    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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Sylvain71
    Merci pour cette solution, elle fonctionne à merveille ... sous FF

    Sous ie, cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var AllScripts=div.getElementsByTagName("script");
    ne retourne aucun élément.
    Je confirme, ca fonctionne pas du tout sous IE7. Bizzare...

  12. #12
    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
    En effet, il y a des problèmes sous IE 7...
    Code corrigé :
    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
    57
    58
    59
    60
    61
    62
    63
    64
    // setInnerHTML Sécurisé
    function setInnerHTML(divContent, HTML) {
        divContent.innerHTML=HTML; 
        try {
          var All=divContent.getElementsByTagName("*");
          for (var i=0; i<All.length; i++) {
            All[i].id=All[i].getAttribute("id")
            All[i].name=All[i].getAttribute("name")
            All[i].className=All[i].getAttribute("class")
          }
        } catch (ex) {}
        try {
          var AllScripts=HTML.extractTags("script");
          AllScripts.forEach(function (v) {
            eval(v);
          })
        } catch (ex) {}
        try {
          var AllStyles=HTML.extractTags("style");
          AllStyles.forEach(function (v) {
            var s=document.createStyleSheet()
            s.cssText=v;
            s.enabled=true;
          }, true)
        } catch (ex) {}
    }
     
    String.prototype.extractTags=function(tag) {
        var matchAll = new RegExp('(?:<'+tag+'.*?>)((\n|\r|.)*?)(?:<\/'+tag+'>)', 'img');
        var matchOne = new RegExp('(?:<'+tag+'.*?>)((\n|\r|.)*?)(?:<\/'+tag+'>)', 'im');
        return (this.match(matchAll) || []).map(function(scriptTag) {
          return (scriptTag.match(matchOne) || ['', ''])[1];
        });
      }
     
    Object.prototype.forEach=function(delegate, ownpropertiesonly) {
            if (typeof(delegate)=="function") {
                if (this instanceof Array && typeof(ownpropertiesonly)=="undefined") {
                    ownpropertiesonly=true;
                }
                for (key in this) {
                    var ok = (!ownpropertiesonly);
                    if (!ok) {
                        try {
                            ok=this.hasOwnProperty(key)
                        } catch (ex) {}
                    }
                    if (ok) {
                        try { delegate(this[key], key, this) } catch(e) {
                            // ...
                        }
                    }
                }
            }
            return false;
        }
     
    Object.prototype.map=function(iterator) {
        var results = [];
        this.forEach(function(value, index) {
          results.push(iterator(value, index));
        });
        return results;
      }
    Testez voire si ca marche (comme c'est extrait d'un code bcp plus long, il se peut que des méthodes manquent dans l'extrait)
    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

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Nikel ca marche, merci.

    Edit: Par contre j'ai un autre soucis (Tjr sous IE7). Les styles CSS de ma feuille de style ne sont pas appliqué sur le code HTML ajouté via le "innerHTML".

  14. #14
    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
    Sur ?

    Pourtant j'ai mis un truc pour faire ca... Je regarderais ca demain, peut-être ai-je fait une faute dans mon script
    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

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Ouai je confirme, les classes et id ont une valeur null sous IE7. du coup aucun style CSS applicable. :/

  16. #16
    Membre chevronné
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Novembre 2004
    Messages
    1 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 284
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour,

    Est ce que depuis vous auriez réussi à corriger ce bug de style ?

    Ou peut etre trouver une autre technique qui permet de corriger ce probleme de script qui ne se recharge pas quand on fait un innerHTML.

    Merci à vous pour vos réponses,

  17. #17
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Problème de ce code, c'est qu'il ne fonctionne pas
    - avec prototype.js, car les méthodes map existent déjà
    - il ne charge pas les scripts incorporés via <script src=...></script>

    Par contre avec la 1ère version, ça fonctionne très bien.

Discussions similaires

  1. [AJAX] Executer code javascript écrit par ajax
    Par socket77 dans le forum AJAX
    Réponses: 1
    Dernier message: 23/12/2009, 08h13
  2. Executer du javascript chargé par une requête AJAX
    Par HWICE dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 12/10/2009, 15h29
  3. Réponses: 1
    Dernier message: 25/09/2009, 12h03
  4. [AJAX] Champ suggestion et portion de page chargé par ajax
    Par VinceMD dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 09/03/2009, 18h54
  5. [AJAX] Accès fonctions déclarées dans page chargée par Ajax
    Par yagrasdemonde dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 04/02/2008, 15h33

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