Formulaire AJAX avec un wait pour le bouton valider

Répondre
N@b
le 17/07/2008 à 19:11
N@b
Bonjour ...

j'ai récupéré un code AJAX pour l'installer dans l'une de mes pages Web pour un éventuel moteur de recherche.

Bien sure, comme c'est de l'ajax le formulaire est vaidé sans chargement de page de résultat , hors le bouton "Valider" pour lancer la recherche reste toujours actif pendant la phase de recherche et donc pour éviter k'il soit recliké et pour avertir le visiteur ke la phase recherche est en cours je souhaiterai le désactiver mais voilà , comme c'est de l'ajax j'ai pas réussis ...

Merci de m'indiker comment et où ajouter d code JS pour permettre a remplacer le texte du bouton "Envoyer" par "Recherche en cours ..." après avoir cliké dessus.

Voici le code a complet ( simple ) des deux pages :

PAGE : index.html

<script type="text/javascript" src="code.js"></script>
<form method="post" onsubmit="maFonctionAjax(this.Id.value,this.Nom.value);return false" action="">
<table border="0" cellspacing="0">
<tr>
<td colspan=2>
Formulaire Ajax
</td>
</tr>
<tr>
<td>Id:</td>
<td>
<input name="Id" id="Id" type="text"></td>
</tr>
<tr>
<td>Nom:</td>
<td><input name="Nom" id="Nom" type="text"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="envoyer" /></td>
</tr>
</table>
</form>
<div id="msg"></div>


PAGE : code.js

function maFonctionAjax(Id, Nom) 
{
var OAjax;
if (window.XMLHttpRequest) OAjax = new XMLHttpRequest();
else if (window.ActiveXObject) OAjax = new ActiveXObject('Microsoft.XMLHTTP');
OAjax.open('POST',"maPageDeRequPHP.php",true);
OAjax.onreadystatechange = function()
{
if (OAjax.readyState == 4 && OAjax.status==200)
{
if (document.getElementById)
{
if (OAjax.responseText =='true') { /* OK */
document.getElementById('msg').innerHTML='<font color=GREEN>'+OAjax.responseText+'</font>';
}else{ /* PAS OK */
document.getElementById('msg').innerHTML='<font color=RED>'+OAjax.responseText+'</font>';
}
}
}
}
OAjax.setRequestHeader('Content-type','application/x-www-form-urlencoded');
OAjax.send('Id='+Id+'&Nom='+Nom);
}


PAGE : maPageRequPHP.php

<? 
session_start();

$erreurs=array();//tableau qui stocke les erreurs.

if(!$_POST['Id']){
$erreurs[]='Id: Veuillez encoder un Id';
}

if(!$_POST['Nom']){
$erreurs[]='Nom: Veuillez encoder un Nom';
}

if(count($erreurs)==0)
{

//ici tu enregistres les valeurs dans la bdd

echo "true";//cette valeur sera traité par ajax est vaut dire que tt passe pour le bien

// connexion la base de donnée

$nom=$_POST["Nom"];

echo $nom;

$search = mysql_query("SELECT * FROM chansons WHERE artiste LIKE '%$nom%'");
$nb = mysql_num_rows($search);
echo "$nb<br><br>";
while ($s=mysql_fetch_array($search)) {
$titre_song = $s["titre_song"];
echo "$titre_song<br>";
}

// cette boucle est ajouté pour vérifier le fonctionnement du bouton "Envoyer" du formulaire
for ($i=0;$i<=10000;$i++)
{
echo "$i<br>";
}
}
else
{
echo "<p class='erreur'>";
for($i=0;$i<count($erreurs);$i++)
{
echo "- ".$erreurs[$i].".<br />";
}
echo "</p>";
}
?>


Merci encore pour votre aide ...

Cordialement
LA GLOBULE
le 17/07/2008 à 21:31
LA GLOBULE
L'idée est la suivante :
- au moment du click sur le bouton, tu dois effacer ton bouton du DOM et le remplacer par un texte
- une fois l'ajax fini avec ou sans erreur, tu dois réafficher un bouton de soumission

Jusque la, a priori, tu as saisis le truc.

Maintenant, pour effectuer ces opérations, il existe deux solutions dont 1 degeulasse :
- modifier le code HTML via la méthode innerHTML (la solution crade)
- créer / effacer des noeuds dans le DOM via les méthodes createElement, createTextNode, removeChild (la solution propre)

Je te laisse un peu explorer ces éléments, si tu n'y arrives pas, on essaiera de faire quelque chose.
LupusMic
le 18/07/2008 à 10:04
LupusMic
J'approuve la Globule, et je rajouterais quelque solutions :
- cacher le bouton de soumission en modifiant son style
- le désactiver via l'attribut disabled de l'input concerné

Il doit y avoir encore plein de solution :) Et même des plus crades que innerHTML ;)
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
N@b
le 18/07/2008 à 14:07
N@b
Bonjour ...

j'ai essayé de développé kelkechose qui se rapproche de innerHTML mais j'ai pas mal modifié mes lignes pour en arriver à ce résultat que j'ajoute dans ma page index.html , malheureusement cela ne marche pas et pourtant je suis sûre que c'est le bon code smiley

Le voici :

<script type="" language="javascript">
function SendForm(){
$('BTsubmit').disabled='disabled';
$('BTsubmit').value='en cours ...';
new Ajax.Request('maPageDeRequPHP.php',{
method: 'post',
asynchronous: true,
contentType: 'application/x-www-form-urlencoded',
encoding: 'UTF-8',
onSuccess: function(){SearchOK();},
onFailure: function(){}
});
function SearchOK(){
$('BTsubmit').style.visibility = 'hidden';
$('BTsubmit').style.display = 'none';
}
}
</script>


et j'ajoute dans le bouton le code suivant "<input type="submit" name="send" id="BTsubmit" value="Envoyer">

malheureusement ça marche pas comme je le voulais ^^

Merci pour votre aide ...

Cordialement
LupusMic
le 18/07/2008 à 15:32
LupusMic
Ah oui mais non, ça ne va pas aller. Quand on pose une question, il faut aussi dire ce qu'on utilise de particulier. Ici c'est visiblement la bibliothèque Prototype. Je n'ai rien contre, mais il faut le préciser.

Bref, d'après la documentation de prototype, onSuccess n'est franchement pas utilisé à l'envoie de la requête. Donc c'est normal que le bouton ne disparaisse pas.

Tu devrais plutôt cacher le bouton avant d'envoyer la requête Ajax, et de définir le comportement du bouton en fonction du succès la requête Ajax en utilisant les callbacks de l'objet Ajax.Request de Prototype.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours