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

AJAX Discussion :

[AJAX] Appel Ajax dans un appel Ajax avec JS et PHP


Sujet :

AJAX

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut [AJAX] Appel Ajax dans un appel Ajax avec JS et PHP
    Bonjour,

    J'ai un souci et je ne sais pas comment le résoudre

    J'ai un script php (PHP1) associé à un script javascript (JS1).
    Dans ce javascript, une fonction fait un appel en Ajax sur une autre page php (PHP2) et insert le résultat de cet appel dans une division grâce à un innerHTML.

    Jusque là tout va bien, l'inclusion du retour du script de PHP2 est bon, tout s'affiche et réagit comme convenu à une exception près ...

    En effet dans mon script PHP2, un code Javascript est inséré et une fonction fait un appel Ajax vers un autre script php (PHP3) contenant aussi du javascript.

    Depuis PHP1, j'obtiens PHP2 mais sans l'intégration de PHP3.
    Mais de PHP2 j'obtiens correctement PHP3.

    Comment faire prendre en compte à PHP1 l'existence de PHP3 à travers PHP2?

    Je ne sais pas si j'ai été très clair

    J'ai pu lire que la fonction javascript eval() permet d'exécuter du code javascript inclus dans un String mais j'ai pu faire quelques tests, sans résultats satisfaisant (peut être une mauvaise utilisation de ma part).

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    C'est un problème crucial pour moi, je me permet donc de détailler mon problème.

    Premièrement, Mon appel Ajax a partir de la page chargée par l'utilisateur :
    Code xhtml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <div id='attachedFiles' style='text-align: left;'>
    	<script type="text/javascript">
                    getUpload("<?php echo $id_project;?>", "", "","<?php echo $_SESSION["login"];?>");
            </script>
    </div>

    La fonction appelée:
    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
     
    function getUpload(project, cr, type, login){
        if (window.XMLHttpRequest) // Mozilla, Safari, ...
        	var xmlhttp = new XMLHttpRequest();
        else if (window.ActiveXObject) // IE
        	var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     
     
    	xmlhttp.open("GET", "TestUpload.php?project="+project+"&cr="+cr+"&type="+type+"&login="+login+"&random="+Math.random());
    	xmlhttp.onreadystatechange=function()
    	{
    		if (xmlhttp.readyState == 4)
    		{
    			// select the section to display
    			if(type == ""){
    				var div = "attachedFiles";
    			}else if(type == "solution"){
    				var div = "attachedFilesSolution";
    			}else if(type == "whereUsed"){
    				var div = "attachedFilesWhereUsed";
    			}
     
    			document.getElementById(div).innerHTML = xmlhttp.responseText;
     
    		}
    	};
    	xmlhttp.send(null);
    }
    Une fois mon appel Ajax effectué, voilà le second appel Ajax fait sur le onload de la page cible du premier appel:
    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
     
    function reloadFiles(readOnly, project, cr, type, login){
        if (window.XMLHttpRequest) // Mozilla, Safari, ...
        	var xmlhttp = new XMLHttpRequest();
        else if (window.ActiveXObject) // IE
        	var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     
    	xmlhttp.open("GET", "httpRequest/files.php?readOnly="+readOnly+"&project="+project+"&cr="+cr+"&type="+type+"&random="+Math.random());
    	xmlhttp.onreadystatechange=function()
    	{
    		if (xmlhttp.readyState == 4)
    		{
    			document.getElementById("files_<?php echo $type;?>").innerHTML = eval(xmlhttp.responseText);
    		}
    	};
    	xmlhttp.send(null);
    }
    La page appelée par ce dernier appel est uniquement constituée de php et de html.

    L'utilisateur n'a pas le retour Ajax dans la page qu'il visualise. Cependant si il charge la page cible du premier appel Ajax, la il voi le contenu attendu.

    Peut on se faire suivre plusieurs appel Ajax?
    Apparemment oui,

    En simplifiant les fichiers on peut résumé comme ceci:

    Page0.html
    Code xhtml : 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
     
    <html><body>
    Ajax first
    <script type="text/javascript">
            if (window.XMLHttpRequest) // Mozilla, Safari, ...
                var xmlhttp = new XMLHttpRequest();
            else if (window.ActiveXObject) // IE
                var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     
     
            xmlhttp.open("GET", "./page1.php?random="+Math.random());
            xmlhttp.onreadystatechange=function()
            {
                    if (xmlhttp.readyState == 4)
                    {
                            document.getElementById("toto").innerHTML = xmlhttp.responseText;
                    }
            };
            xmlhttp.send(null);
    </script>
    <div id="toto"></div>
    </body></html>

    Page1.html
    Code xhtml : 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
     
    <html><body>
    Page 1
    <script type="text/javascript">
            if (window.XMLHttpRequest) // Mozilla, Safari, ...
                var xmlhttp = new XMLHttpRequest();
            else if (window.ActiveXObject) // IE
                var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     
     
            xmlhttp.open("GET", "./page2.php?random="+Math.random());
            xmlhttp.onreadystatechange=function()
            {
                    if (xmlhttp.readyState == 4)
                    {
                            document.getElementById("titi").innerHTML = xmlhttp.responseText;
                    }
            };
            xmlhttp.send(null);
    </script>
    <div id="titi"></div>
    </body></html>

    Page2.html
    Code xhtml : Sélectionner tout - Visualiser dans une fenêtre à part
    <html><body>Page 2</body></html>

    le resultat:
    Ajax first
    Page 1
    Par contre si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("toto").innerHTML = xmlhttp.responseText;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.write(xmlhttp.responseText);
    J'obtiens
    Page 1 Page 2
    mais je peut entrevoir
    Ajax first
    avant que Page 1 Page 2 ne s'affiche.

    Je ne comprend pas pourquoi je n'arrive pas avoir ma Page2.html.

  3. #3
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Citation Envoyé par Gajilidd Voir le message
    Bonjour,

    J'ai un souci et je ne sais pas comment le résoudre

    J'ai un script php (PHP1) associé à un script javascript (JS1).
    Dans ce javascript, une fonction fait un appel en Ajax sur une autre page php (PHP2) et insert le résultat de cet appel dans une division grâce à un innerHTML.

    Jusque là tout va bien, l'inclusion du retour du script de PHP2 est bon, tout s'affiche et réagit comme convenu à une exception près ...
    Ici c'est l'utilisation normal d'une requete AJAX, rien à dire;


    Citation Envoyé par Gajilidd Voir le message
    En effet dans mon script PHP2, un code Javascript est inséré et une fonction fait un appel Ajax vers un autre script php (PHP3) contenant aussi du javascript.
    Pourquoi ce n'est pas JS1 lors du succès du chargement de PHP2 qui fait cette opération ?

    Tu peux très bien enchainer les requête AJAX dans JS1.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Oui je pourrais en effet mais mon but n'est pas la, j'aimerais garder ma structure de fichier pour me permettre d'avoir une sorte de module que je pourrais inclure ou bon me semble dans mes pages.

    Donc garder Php2 avec un appel Ajax vers Php3 pour me permettre d'insérer ce modèle partout grâce a un appel Ajax.

  5. #5
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Il va falloir que tu trouves un autre moyen :

    Pourquoi les événements disparaissent après une mise à jour avec AJAX ?

    Je pense qu'il en est de même pour le script JS injecté. ce que fait une requête AJAX.

    Il te reste plus qu'à mettre tous tes scripts dans la balise HEAD. (Attention ça charge la mémoire pour rien) ou trouver un autre moyen de gérer ton imbrication de page.

    Je profite également pour corriger tes exemples


    Page0.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
    17
    18
    19
    20
    21
    22
     
    <html><body>
    Ajax first
    <script type="text/javascript">
    	if (window.XMLHttpRequest) // Mozilla, Safari, ...
    	    var xmlhttp = new XMLHttpRequest();
    	else if (window.ActiveXObject) // IE
    	    var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     
     
    	xmlhttp.open("GET", "./page1.php?random="+Math.random());
    	xmlhttp.onreadystatechange=function()
    	{
    		if (xmlhttp.readyState == 4)
    		{
    			document.getElementById("toto").innerHTML = xmlhttp.responseText;
    		}
    	};
    	xmlhttp.send(null);
    </script>
    <div id="toto"></div>
    </body></html>

    Page1.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
    17
    18
    19
    20
    21
    22
     
    <div>
    Page 1
    <script type="text/javascript">
    	if (window.XMLHttpRequest) // Mozilla, Safari, ...
    	    var xmlhttp = new XMLHttpRequest();
    	else if (window.ActiveXObject) // IE
    	    var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     
     
    	xmlhttp.open("GET", "./page2.php?random="+Math.random());
    	xmlhttp.onreadystatechange=function()
    	{
    		if (xmlhttp.readyState == 4)
    		{
    			document.getElementById("titi").innerHTML = xmlhttp.responseText;
    		}
    	};
    	xmlhttp.send(null);
    </script>
    <div id="titi"></div>
    </div>
    Page2.html

    Je ne pense pas que tu injectes une page structurer dans une autre page structurer. Sinon il faut revoir tes leçons Web 2.0, allez plus loin avec AJAX et XMLHttpRequest

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'ai un problème similaire, mais je ne sais pas si c'est exactement le même.

    Voilà, j'essaye d'accéder en javascript à un objet chargé par par xmlhttprequest. Seulement que ça marche pas...

    Voilà mon code:

    Le code chargé en asynchrone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <form method="post" action="?dialog=LogLost&state=check" name="form_lost" class="form" >
    	<label>Email *</label><input type="text" name="data1" /><br />
    	<label>T&eacute;l mobile *</label><input type="text" name="data2" /><br />
    	<p>* les champs marqu&eacute;s avec une croix sont obligatoires</p>
    	<input class="btSubmit" type="submit" name="submit" value="Verifier" />
    </form>
    Le code javascript:
    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
     
    function createXhrObject() {
        if (window.XMLHttpRequest) return new XMLHttpRequest();
     
        if (window.ActiveXObject){
            var names = [
                "Msxml2.XMLHTTP.6.0",
                "Msxml2.XMLHTTP.3.0",
                "Msxml2.XMLHTTP",
                "Microsoft.XMLHTTP"
            ];
            for(var i in names){
                try{ return new ActiveXObject(names[i]);}
                catch(e){}
            }
        }
        window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest.");
        return null; // non supporté
    }
     
    function chargeContent(){
    	xhr = createXhrObject();
    	xhr.onreadystatechange = function() {
    		if (xhr.readyState==4) {
    			$('#dialog-box').html(xhr.responseText);
    			$('#dialog-box').dialog('open');
    		}
    	};
     
    	xhr.open("GET", "inc/inc_form_loglost.php" , true);
    	xhr.send(null);
    }
     
    $('.btDialog').click(function() {
    	chargeContent();
    });
     
    $('.btSubmit').click(function() {
    	alert('test submit');
    });
    (j'ai essayer de simplifier le code au max, j'espère rien avoir omit...)

    Où ça bloque, c'est donc la dernière opération sur .btSubmit

    N'hésitez pas à me gronder si j'ai fais de grossières erreurs.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    hum okok donc je ne peut pas se faire succeder plusieurs appel Ajax ....

    Donc je dois remplacer mon premier appel par un include() en php par exemple?
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <div id='attachedFiles' style='text-align: left;'>
    	<?php
                    $login = $_SESSION["login"];
                    $project = $id_project;
                    $cr = '';
                    $type = '';
                    include 'TestUpload.php';
            ?>
    </div>

    Il te reste plus qu'à mettre tous tes scripts dans la balise HEAD.
    Pour le Js dans le Head mon prédécesseur (développer) n'y tenais pas compte, des balises script se trimbalent un peut partout.

    Quand je fait ca, J'ai bien ma page TestUpload.php qui se charge. Cependant le reste ne se fait pas (comme avant), peut être car mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.onload = reloadFiles();
    en plein milieu de code ne fonctionne pas?

    Ma façon d'inclure est-elle correcte?

  8. #8
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Citation Envoyé par llaffont Voir le message
    Il te reste plus qu'à mettre tous tes scripts dans la balise HEAD. (Attention ça charge la mémoire pour rien) ou trouver un autre moyen de gérer ton imbrication de page.
    Mes propos ne sont pas vraiment juste :

    Tes scripts seront bien pris en compte à ce moment la mais tous les événements qui si rapporte seront ignoré dès la première imbrication AJAX.

    Il faudra re -déclaré les évènements après le succès du chargement de ta requête AJAX. (voir réponse fait à dorignan juste en dessous)

    Un conseil regarde du côté d'un Framework comme JQUERY si tu n'utilises AJAX que pour de l'aspect.

  9. #9
    Membre confirmé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 701
    Points : 597
    Points
    597
    Par défaut
    Citation Envoyé par dorignan Voir le message
    Où ça bloque, c'est donc la dernière opération sur .btSubmit
    Essaye ça ! et relis
    Pourquoi les événements disparaissent après une mise à jour avec AJAX ? si tu veux comprendre la raison.


    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
     
    function createXhrObject() {
        if (window.XMLHttpRequest) return new XMLHttpRequest();
     
        if (window.ActiveXObject){
            var names = [
                "Msxml2.XMLHTTP.6.0",
                "Msxml2.XMLHTTP.3.0",
                "Msxml2.XMLHTTP",
                "Microsoft.XMLHTTP"
            ];
            for(var i in names){
                try{ return new ActiveXObject(names[i]);}
                catch(e){}
            }
        }
        window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest.");
        return null; // non supporté
    }
     
    function chargeContent(){
    	xhr = createXhrObject();
    	xhr.onreadystatechange = function() {
    		if (xhr.readyState==4) {
    			$('#dialog-box').html(xhr.responseText);
    			$('#dialog-box').dialog('open');
    eventClickbtSubmit();
    eventClickbtDialog();
    		}
    	};
     
    	xhr.open("GET", "inc/inc_form_loglost.php" , true);
    	xhr.send(null);
    }
     
    function eventClickbtDialog(){
    $('.btDialog').click(function() {
    	chargeContent();
    });
    }
    function eventClickbtSubmit(){
    $('.btSubmit').click(function() {
    	alert('test submit');
    });
     
    }

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Hum ok je comprend un peut mieux, mais une chose me chiffonne, quand j'appel ma page TestUpload.php directement par le navigateur, j'ai la page à 100% fonctionnelle. Mais quand je l'inclue par php dans une autre page, elle ne l'est plus, la collection d'objets HTMLElement aurait du être faite avec cette inclusion?

    Donc mes événements venant de mon appel Ajax devraient être bon comme mon appel depuis la page source (sans inclusion)?

    Si non, comment forcer la régénération de cette collection, dans la FAQ, l'auteur parle de la fonction afterAjax(), comment la créer ou où la trouver (savoir la créer me conviendrais mieux)?

    Peut-on appeler à nouveau la fonction appelé au chargement ou faut-il recréer cette collection?

    Edit: Apparemment cela ne fonctionnais pas a cause d'un eval() qui traînais encore.

    Maintenant une grande question se pose, dans ma page une valeur s'actualise en Javascript, comment faire en sorte de re-inclure ma page avec les nouvelles données? Sans rechargement de la page?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Pour donner des nouvelles, la solutions de mettre l'écouteur du click dans une fonction, appelée après le chargement des données, fonctionne.

    Merci beaucoup pour le coup de main!

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/09/2014, 16h45
  2. Appel de thickbox dans un contenu ajax
    Par fox1 dans le forum jQuery
    Réponses: 7
    Dernier message: 02/12/2009, 16h40
  3. [AJAX] recuperer valeurs dans Div après Ajax.Updater
    Par Alexdezark dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/11/2008, 22h25
  4. appel de javascript impossible dans page appelée en ajax
    Par brazilia28 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/08/2007, 10h48
  5. [AJAX] Div contenu dans une page ajax
    Par Xris dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/06/2007, 14h34

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