Formulaire & Ajax
Posté : 10 sept. 2021, 19:48
Bonjour,
En formation développeur-intégrateur web, je suis bloqué sur un devoir qui porte sur Ajax. Après plusieurs jours de dépatouillage, j'ai enfin réussi à obtenir plus ou moins ce que je voulais, mais le résultat ne correspond pas totalement à la demande et je bloque complètement.
Tout d'abord, la partie de l'énoncé qui me pose problème :
En formation développeur-intégrateur web, je suis bloqué sur un devoir qui porte sur Ajax. Après plusieurs jours de dépatouillage, j'ai enfin réussi à obtenir plus ou moins ce que je voulais, mais le résultat ne correspond pas totalement à la demande et je bloque complètement.
Tout d'abord, la partie de l'énoncé qui me pose problème :
J'ai réussi une partie de cet énoncé : quand on clique sur le bouton notation, la requête est envoyée au serveur PHP et le formulaire inséré dans la page index.html. Et quand on appuie sur le bouton close, le formulaire est caché et le bouton notation réapparait. Mais j'ai un problème :Demande 2
Complétez votre code JavaScript pour fournir le comportement suivant.
Écoutez en JavaScript, la modification de l’élément Select.
Lorsque l’utilisateur choisit une note:Le Javascript doit être unobstrusive.
- Envoyez au serveur PHP une requête AJAX en envoyant la valeur de l’élément et en récupérant en JavaScript
l’url du script PHP dans l’attribut ACTION de l’élément FORM.
Sur le serveur- A l’aide de la valeur du SELECT, il doit retrouver dans son tableau de correspondance (array) sa correspondance américaine (voir Devoir N° 1 de JavaScript perfectionnement)
- Votre code PHP doit retourner le message « La notation américaine pour la note X est X». Javascript le récupère
et l’affiche dans un élément de la page.
Demande 3
Dans votre code JavaScript: ne générez plus le formulaire. Celui-ci sera généré par le PHP, sur demande du
Javascript (requête Ajax): voir ci-dessous.Le JavaScript doit être unobstrusive.
- Lorsque la page est chargée (évènement onload), et que l’utilisateur clique sur le bouton “notation”, envoyez
une requête au serveur php pour récupérer le HTML du formulaire et insérez-le dans le body. Cachez alors le
bouton notation en lui affectant un attribut style (css) “display:none;”- Si l’utilisateur clique sur un nouveau bouton « close», cachez le formulaire et faites réapparaitre le bouton
« notation».- Si l’utilisateur reclique sur le bouton « notation», testez si le formulaire est déjà inséré dans le HTML. Si oui,
réaffichez-le et cachez le bouton, sinon demandez (en JS) le formulaire en Ajax au serveur PHP.
- Lorsque je change la valeur du select, le formulaire est bien envoyé mais il me redirige vers la page form.php. Or, ce que je souhaiterais, c'est que le résultat soit également affiché sur la page index.html. Changer le action du formulaire ne fait que recharger la page index.html (et donc le formulaire disparaît...).
index.html
script.js<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Correspondance des notes de musique classiques et américaines</title> <script src="script.js"></script> <link rel="stylesheet" href="style.css"> </head> <body> <input type="button" id="notationBtn" value="Notation"> <div id="phpDiv"></div> </body> </html>
form.php(function() { var jsNotes = { init: function() { window.addEventListener('load', function(event) { var notationBtn = document.getElementById('notationBtn'); notationBtn.addEventListener('click', function(event) { event.preventDefault ? event.preventDefault() : event.returnValue = false; var closeBtn = document.createElement('input'); closeBtn.type = 'button'; closeBtn.id = 'closeBtn'; closeBtn.value = 'Close'; document.body.appendChild(closeBtn); notationBtn.style.display = 'none'; closeBtn.style.display = 'block'; phpDiv.style.display = 'block'; if (!document.getElementById('formNotes')) { var xhr = new XMLHttpRequest(); xhr.addEventListener('readystatechange', function(event) { if (xhr.readyState == 4) { if (xhr.status == 200) { var phpDiv = document.getElementById('phpDiv'); phpDiv.innerHTML = xhr.responseText; } else { alert ('error code ' + xhr.status + ' : ' + xhr.statusText); } } }); xhr.open('GET', 'form.php', true); xhr.send(); } else { phpDiv.style.display = 'block'; } var stdNote = document.getElementById('stdNote'); stdNote.addEventListener('change', function(event) { var results = document.getElementById('results'); phpDiv.appendChild(results); }) closeBtn.addEventListener('click', function(event) { event.preventDefault(); notationBtn.style.display = 'block'; closeBtn.style.display = 'none'; phpDiv.style.display = 'none'; }) }); }); } }; jsNotes.init(); })();
J'ai beau chercher sur internet, me tourner les méninges, rien n'y fait, je n'arrive pas à faire en sorte que le result soit également inséré dans mon index.html, si quelqu'un peut m'indiquer ce que je fais mal, ou ce que je ne fais pas ?<!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['stdNote'])) { $result = '<p>Aucune note sélectionnée.</p>'; } else { $note = $_POST['stdNote']; $result = '<p>La note classique '. $note .' correspond à la note américaine '. $notes[$note] .'.</p>'; } echo $result; return; } ?> <html lang="fr"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Correspondance des notes de musique classiques et américaines</title> </head> <body> <h1>Correspondance américaine des notes de musique</h1> <form action="form.php" method="POST" id="formNotes"> <fieldset> <legend>Correspondance classique > américaine</legend> <label for="stdNote">Sélectionnez une note : </label> <select name="stdNote" id="stdNote" onchange="this.form.submit()"> <option value="">Choix</option> <?php foreach ($notes as $stdNote => $usNote): ?> <option value="<?php echo $stdNote ?>"><?php echo $stdNote ?></option> <?php endforeach ?> </select><br> <div id="results"><?php echo $result ?></div> </fieldset> </form> </body> </html>
Merci d'avance !