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 :

Récupérer du HTML ajouté avec AJAX


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 28
    Par défaut Récupérer du HTML ajouté avec AJAX
    Bonjour,

    Voici mon problème :

    Après une requête Ajax de placer un formulaire(formulaire.php) dans une page index.php (cela fonctionne), je souhaite récupérer le DOM du formulaire...pour ensuite refaire une requête Ajax;

    Mon code:index.php
    Code php : 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
    <!DOCTYPE html>
    <?php
    $notes=array ('Do'=>'C' , 'Ré'=>'D' , 'Mi'=>'E' , 'Fa'=>'F' , 'Sol'=>'G' , 'La'=>'A' , 'Si'=>'B');
    $result="";
     if($_SERVER["REQUEST_METHOD"]=="POST"){
     if(!empty($_POST['noteSelected'])){
    	$note=$_POST['noteSelected'];
    	if($note!=='Choisir...'){
    		$result='<p>La note '.$note.' correspond à la note '.$notes[$note].', en notation américaine.</p>';
    	}
    }
    echo $result;
    }
    ?>
    <head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
    <html lang="fr">
    <title>Convertisseur de note musicale</title>
    <link href="note_music_style.css" rel="stylesheet" type="text/css" />
    <script src="code.js"></script>
    </head>
    <body>
    <div id="formulaire"></div>
    </body>
    </html>


    formulaire.php
    Code html : 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
    <form action="index.php" method="post" id="form">
    	<fieldset>
    	<legend>Conversion des notes de musique</legend>
    	<p>Choisissez une note:</p>
    		<select name="noteSelected" id="sel">
    			<option value="">Choisir...</option>
    		<?php
                    $notes=array ('Do'=>'C' , 'Ré'=>'D' , 'Mi'=>'E' , 'Fa'=>'F' , 'Sol'=>'G' , 'La'=>'A' , 'Si'=>'B');
                    foreach($notes as $noteSelected=>$noteCorrespondante){
                    echo'<option value="'.$noteSelected.'">'.$noteSelected.'</option>';
                    }
                    ?>
    		</select>
    	<p id="message"></p>
    	</fieldset>
    </form>

    code.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
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     window.addEventListener("load", function(event) {
     
     /*Création du titre*/
     
    	var titre=document.createElement('div');
    	titre.innerHTML='Convertisseur de note musicale ';
     
    	document.body.appendChild(titre);
     
    /*Création du bouton Notation*/	
    	var buttonNotation=document.createElement('button');
    		buttonNotation.value="Notation";
    		buttonNotation.name="Notation";
    		buttonNotation.innerHTML="Notation";
     
    	titre.appendChild(buttonNotation);
     
    /*Création du tableau de correspondance*/
    		note={'Choisir...':' ','Do':'C','Ré':'D','Mi':'E','Fa':'F','Sol':'G','La':'A','Si':'B'};
     
    /*Création et apparition du bouton Close*/
    			var buttonClose=document.createElement('button');
    			buttonClose.value="Close";
    			buttonClose.name="Close";
    			buttonClose.innerHTML="Close";
    			buttonClose.style.display="none";
     
     
    /*requéte AJAX formulaire*/
    buttonNotation.addEventListener('click',function(event){
    (function(){
    	var fonctionFormulaire={
    		init:function(){
     
    			/*Disparition du bouton Notation et apparition du bouton Close*/
    			buttonNotation.style.display="none";
    			buttonClose.style.display="block";
     
    			titre.appendChild(buttonClose);
     
    			event.preventDefault();
     
    			var formulaire=document.getElementById('formulaire');	
     
    			var xmlhttp=new XMLHttpRequest();
     
    				xmlhttp.addEventListener('readystatechange',function(event){
     
    					if(xmlhttp.readyState==4){
    						if(xmlhttp.status=="200"){	
    							formulaire.innerHTML=xmlhttp.responseText;	
    							titre.appendChild(formulaire);
    						}
    					else
    						{
    							alert('error code'+xmlhttp.status+':'+xmlhttp.statusText);
    						}
    					}
    			    });			
    			xmlhttp.open("GET","formulaire.php",true);
    			xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8");
    			xmlhttp.send();
    			}
    			}
    		fonctionFormulaire.init();
    	})()
    });
     
    /*Disparition du formulaire, du bouton close et apparition du bouton notation*/
    			buttonClose.addEventListener('click',function(event){
    			formulaire.style.display="none";
    			buttonNotation.style.display="block";
    			buttonClose.style.display="none";
     
    			titre.appendChild(buttonNotation);
    			});
     
    /*Réapparition du formulaire aprés un clic sur le bouton Notation*/
    			buttonNotation.addEventListener('click',function(event){
    			formulaire.style.display="block";
    			});
     
     
     /*Requéte AJAX */
    (function(){
    	var resultat={
    		init:function(){
     
    			var sel=document.getElementById('sel');
     
    			sel.addEventListener('change',function(event){
     
    			event.preventDefault();
     
    			var noteSelected=sel.options[sel.selectedIndex].value;
     
    			alert(noteSelected);
     
    			var xmlhttp=new XMLHttpRequest();
     
    				xmlhttp.addEventListener('readystatechange',function(event){
     
    					if(xmlhttp.readyState==4){
    						if(xmlhttp.status=="200"){
     
    							var message=document.getElementById('message');
    							message.innerHTML=xmlhttp.responseText;
     
    						}
    					else
    						{
    							alert('error code'+xmlhttp.status+':'+xmlhttp.statusText);
    						}
    					}
    			    });
     
    			xmlhttp.open("POST","index.php",true);
    			xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8");
    			xmlhttp.send("noteSelected="+noteSelected);
    			});
    			}
    		}
    		resultat.init();
    	})()
    });
    C'est au niveau de la seconde requête Ajax, qu'il y a un problème.

    J'ai essayer de placer un alert dans la deuxième requête mais rien ne se passe...

    D'avance, merci pour vos réponses.

    Cordialement.

  2. #2
    Membre chevronné
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Par défaut
    Le problème vient de ce qu'au moment où est exécutée : resultat.init(), c'est à dire sur l'événement load de window, ton formulaire n'est pas encore dans la page et, a fortiori, le select non plus. Donc document.getElementById("sel") renvoie null.
    Normalement il devrait y avoir une erreur qquepart (console?) sur l'instruction sel.addEventListener(...).

    Le code de index.php me semble incorrect, mais je n'y connais rien.

    Le code javascript est inutilement complexe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (function(){
    	var <object> = {
    		init:function(){
    			// code de la fonction init
    		}
    	};
    	<object>.init();
    })();
    se remplace avantageusement par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // code de la fonction init
    voir, si vraiment une isolation/cloture est indispensable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function(){
    	// code de la fonction init
    })();
    Aussi bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*Création du tableau de correspondance*/
    note={'Choisir...':' ','Do':'C','Ré':'D','Mi':'E','Fa':'F','Sol':'G','La':'A','Si':'B'};
    n'est pas utilisé, et en plus note est déclarée dans le contexte global, soit window.note, volontaire ?

    Pour avancer : tester, tester, tester :
    - dans code.php, met en commentaire le chargement de script :
    <-- <script src="code.js"></script> -->et, au moins pour tester, remplace la méthode de soumission POST par GET ;
    - dans un navigateur appelle ta page : http://.../index.php ;
    - regarde le source de la page ;
    - dans un autre onglet (ou fenêtre) appelle ta page avec : http://.../index.php?noteSelected=Do ;
    - compare le source de la page avec ce que tu veux obtenir ;
    Quand tu auras corrigé les erreurs dans ton code php, tu pourras t'attaquer au code js.

    L'idée est de tester de manière incrémentale, une chose après l'autre, en ajoutant de la complexité au fur et à mesure.
    C'est à dire dans ton cas :
    - ne conserver que la création du titre et son ajout au body ;
    -- tester ;
    -- comparer le résultat obtenu avec celui désiré ;
    -- corriger ;
    -- recommencer à tester ;
    - ajouter un élément, le bouton buttonNotation ;
    -- tester ;
    -- etc.

    Bon courage.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 28
    Par défaut
    Dans l'exercice précédent, le formulaire était généré par JavaScript (avec des create élément) ensuite le formulaire est traité par PHP via une requête Ajax...Cet exercice est ok et je n'ai pas eu de probléme a le faire.Maintenant c'est le formulaire qui est généré par PHP...

    Je vais réfléchir a vos conseils, Cordialement.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 28
    Par défaut
    "Le problème vient de ce qu'au moment où est exécutée : resultat.init(), c'est à dire sur l'événement load de window, ton formulaire n'est pas encore dans la page et, a fortiori, le select non plus. Donc document.getElementById("sel") renvoie null.
    Normalement il devrait y avoir une erreur qquepart (console?) sur l'instruction sel.addEventListener(...)."

    J'ai analyser ce probléme depuis une console.

    Voilà mon probléme est bien cerné, donc comment faire pour que le DOM de mon formulaire soit accessible lors de mon apparition de mon formulaire sur ma page web ?


    Cordialement

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 28
    Par défaut
    j'ai utiliser "formulaire.addEventListener('load',function(event){ " avant ma fonction résultat...mais cela marche toujours pas.

  6. #6
    Membre chevronné
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Par défaut
    Dans le code HTML que tu donnes en exemple, l'identifiant 'formulaire' correspond à une balise 'div' vide. Avant d'accéder au DOM de ton formulaire, tu dois le charger, donc faire une requête en AJAX. Tu as déjà le code de chargement du formulaire.

    Citation Envoyé par Incognito87 Voir le message
    comment faire pour que le DOM de mon formulaire soit accessible lors de mon apparition de mon formulaire sur ma page web ?
    La réponse est dans la question. Quand ? au chargement de la page ce qui correpond dans ton code à l'évènement 'window.onload'.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/10/2011, 14h32
  2. Interpréter le HTML ajouté avec jQuery
    Par borower dans le forum jQuery
    Réponses: 6
    Dernier message: 11/11/2010, 15h58
  3. [AJAX] ajout avec ajax
    Par j.tel dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/10/2008, 09h20
  4. [AJAX] Ajout de lignes dans une table avec Ajax
    Par Tententai dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/11/2007, 15h54
  5. comment récupérer l'option choisie avec html:select
    Par fakhita dans le forum Struts 1
    Réponses: 18
    Dernier message: 24/07/2007, 17h08

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