Page 1 sur 1

AIDE pour la fonction onreadychange ajax!!!!

Posté : 05 mai 2009, 15:21
par virus321
Bonjour,
voila un petit soucis, j'ai une fonction javascript qui fé apelle à ajax, dans mon fichier de destination j'exécute une commande sql et je retoure un entier ou bien 1 ou bien différent de 1.
mnt suivant la valeur retourné je veux afficher une alerte oubien un formulaire ok/cancel

voila mon code javascript

Code : Tout sélectionner

function Verif_delete(i) { var piloting=document.getElementById("Piloting"+i).value; creerRequete(); var url='Verif_delete.php?Piloting='+piloting; requete.open('GET',url,true); requete.onreadystatechange = traiteReponse1; requete.send(null); } function traiteReponse1() { alert('lol1'); if(requete.readyState == 4) // Complete { if(requete.status == 200) { if(requete.responseText!="") { var pilote=requete.responseText; alert(pilote); if (pilote==1) { alert(" impossible to delete this profile:Please cretae a new profil with the same Piloting zone"); return false; } else if(pilote !=1) { if(confirm('are you sure you want to delete this profile?')) {return true; } else {return false; } } } } } }
mon script vérifie bien la valeur retournée par php et j'ai bien le pessage d'alert ou ok/cancel en fonction de ca! mon problème c'est que dans les deux cas il continue son exécution et il m'efaccer les donner de ma table!
normalement si je clique sur cancel il doit rien ce passer et si j'ai l'alerte beinsur meme si je clique sur ok il effecutue pas le traitement aprés .
voila ma ligne htm qui fé apelle a Verif_delete
 <a href="Delete_rla_cluster.php?id=<?php echo $id;?>"onclick="return Verif_delete(<?php echo "'".$i."'"?>)" > 
<img src="../img/actions/annulation_small.gif" border="0" alt="Supprimer"></a>  
Pouviez vs m'aidez!!!!

Posté : 05 mai 2009, 20:20
par Elie
Manquait 2 }

Code : Tout sélectionner

function traiteReponse1() { if(requete.readyState == 4) { if(requete.status == 200) { if(requete.responseText!="") { var pilote=requete.responseText; alert(pilote); if (pilote==1) { alert(" impossible to delete this profile:Please cretae a new profil with the same Piloting zone"); return false; } else if(pilote !=1) { if(confirm('are you sure you want to delete this profile?')) { return true; } else { return false; } } } } } }

Posté : 06 mai 2009, 10:49
par virus321
Manquait 2 }

Code : Tout sélectionner

function traiteReponse1() { if(requete.readyState == 4) { if(requete.status == 200) { if(requete.responseText!="") { var pilote=requete.responseText; alert(pilote); if (pilote==1) { alert(" impossible to delete this profile:Please cretae a new profil with the same Piloting zone"); return false; } else if(pilote !=1) { if(confirm('are you sure you want to delete this profile?')) { return true; } else { return false; } } } } } }
merci pour ton aide mais bon sur le sujet que j'ai posté c'été une simple erreur du copier coller !!! ca vient pas de la :(

en fait j'ai trouver une solution mais il reste toujours un beug!! je déclare une variable globlale bool et ensuite je la met a true ou false dans mon traitement !! a la fin de ma fonction Verif_delete je retourne le bool et le tour est joué !!!
le sul problème c'est que si je fait comme ca la fonction Verif_delete retourne le bool avant qu'il soit changé par l'ajax !! en grop puisque le script continue son éxécution il retourne le bool avant la modification d'ajax !!!
en mettant une alert au début de ma fonction traitReponse() tout marche bien sauf que biensur il m'afiche l'alert 4 fois de suite avant d'avoir le résultat final !!!
alors ya til une solution !!!

Posté : 06 mai 2009, 11:36
par zeus
Modération :
virus321,

Merci de faire attention à la grammaire et l'orthographe lorsque tu rédiges tes messages.

Si besoin, voici une liste de sites pour t'aider :
Français : Dictionnaires, conjugaison et orthographe.

Posté : 06 mai 2009, 12:33
par Elie
J'ai commencer l'ajax en me simplifiant la vie avec Prototype donc je peux que te proposer de te réecrire la fonction adapté a Prototype

Posté : 06 mai 2009, 14:00
par virus321
J'ai commencer l'ajax en me simplifiant la vie avec Prototype donc je peux que te proposer de te réecrire la fonction adapté a Prototype
je vois pas trop ce que tu veux dire! si ça te dérange pas j'aimerais bien voir un petit example.
Merci.
@ Modérateur : désolé pour les fautes d'orthographes,quand j'écris dans des forums je n'essaye pas de m'appliquer :o je tiendrais compte de votre remarque !!! merci

Posté : 06 mai 2009, 14:03
par Elie
Envoie le contenu de Verif_delete.php et je te montre un exemple !

Posté : 06 mai 2009, 14:16
par virus321
Envoie le contenu de Verif_delete.php et je te montre un exemple !
Envoie le contenu de Verif_delete.php et je te montre un exemple !
voila je t'envoi le code :
function Verif_delete(i)
{

 var piloting=document.getElementById("Piloting"+i).value;
       
	   creerRequete();
       var url='Verif_delete.php?Piloting='+piloting;
		
	
	   requete.onreadystatechange = traiteReponse1;
	   requete.open('GET',url,false);	
	   requete.send(null);

  return bool;     
}
et voila ma fonction traiteReponse1
function traiteReponse1() 
{

if(requete.readyState == 4) // Complete
{ 
  if(requete.status == 200) 
      { 
      if(requete.responseText!="")
          {
          var pilote=requete.responseText;
           alert(pilote);
			  if (pilote==1)
			   { alert(" enable to delete this profile:Please cretae a new profil with the same Piloting zone");
                bool=false;
			   }
              else if(pilote !=1)
                { 
                    if(confirm('are you sure you want to delete this profile?'))
					{bool=true;
					}
					else
					{bool=false;
					}
				 }				
          } 
      }
}
et biensur la fonction creeRequete
function creerRequete() 
{
if (window.XMLHttpRequest) 
						{	// Mozilla, Safari
						requete= new XMLHttpRequest();
						return requete;
						} 
else if (typeof ActiveXObject != "undefined")
						{
            requete= new ActiveXObject("Microsoft.XMLHTTP"); 
            // note: on peut raffiner pour utiliser // d’autres versions d’IE
						return requete;
						}
}

Posté : 06 mai 2009, 14:22
par Elie
Le contenu de Verif_delete.php

Posté : 06 mai 2009, 14:25
par virus321
lol dsl !!!

voila
<?php
     
        include_once ("../util/wfutils.php");  
		include_once ("../model/BaseDeDonnées.php");
		include_once ("../model/historique.php");
  
		/////////////connection à la base de données//////////////////////////////////
			$oHisto = new historique();
			$BDD = new BaseDeDonnées();
			$BDD->Connection(0);
			
if(isset($_GET['Piloting']))
{

$Piloting = $_GET['Piloting'];
$sql="Select COUNT(Piloting)  from rla where Piloting='".$Piloting."'";
$res=mysql_query($sql);
$nb=mysql_fetch_row($res);
echo $nb[0];

}
?>

Posté : 06 mai 2009, 17:26
par Elie
Donc tout ca est au conditionnel que tu utilises le Framework Prototype http://www.prototypejs.org

Ta fonction JS :

Code : Tout sélectionner

function Verif_delete(i) { new Ajax.Request('Verif_delete.php', { method: 'get', parameters: 'Piloting='+$F('Piloting'+i), asynchronous: false, evalScripts: true, onComplete:function(requete) { if(requete.responseText == 1) { alert("Enable to delete this profile:Please cretae a new profil with the same Piloting zone"); return false; } else { if(confirm('are you sure you want to delete this profile?')) { return true; } else { return false; } } } }); }
Page Verif_page.php
<?php
     
	include_once ("../util/wfutils.php");  
	include_once ("../model/BaseDeDonnées.php");
	include_once ("../model/historique.php");
  
    $oHisto = new historique();
	$BDD = new BaseDeDonnées();
	$BDD->Connection(0);
            
if(!empty(($_GET['Piloting'])) {

	$sql = "SELECT Piloting FROM rla WHERE Piloting = '".$_GET['Piloting']."'";
	$res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
	echo mysql_num_rows($req);
}

?> 

Posté : 06 mai 2009, 17:54
par virus321
Merci pour ta réponse!!
j'étais content quand j'ai lu la solution mais malheureusement ça n'a pas marché ni sur FF ni su IE.
quand je clqiue sur le bouton efacceer ca efface directement sans rien dire!
j'ai modifié un petit truc sur ma fonction précédente et mnt ça marche trés bien sur IE,mais pas de solution pour FF.je sais pas d'ou vient l'erreur!
j'ai donné une valeur à ma colonne piloting et du coup sur IE il arrivie bien a faire le traitement !!
function Verif_delete(i)
{
        
	//ici IE récupère bien la valeur et ça marche nikel 
      // FF récupère bien la valeur mais rien ne marche !
       piloting=document.getElementById("Piloting"+i).value;
         
	  creerRequete();
       var url='Verif_delete.php?Piloting='+piloting;
		
	
	   requete.onreadystatechange = traiteReponse1;
	   requete.open('GET',url,false);	
	   requete.send(null);

  return bool;     
} 
Merci comme même pour ton aide je continuerais à chercher la solution !!
Si t'aurais une idée n'hésite pas !!!

Posté : 06 mai 2009, 18:01
par Elie
Je te dis quoi faire et tu le fais pas ...

Posté : 07 mai 2009, 01:17
par sadeq
Le problème est que le traitement Ajax est asynchrone donc il ne peut plus annuler un traitement qui est parallèle et qui en temps réel le dépasse dans le temps.
Alors tu as 2 solutions : la première est de basculer Ajax en mode synchrone, comme ça, l'interpréteur javascript attendra le résultat Ajax pour continuer et à ce moment là les return false ou true feront effet sur l'événement en cours qui est le clique sur le lien et donc le return false annule l'action.
Je rappelle que pour passer au mode synchrone il faut mettre à false le dernier paramètre de la fonction .open() comme :

Code : Tout sélectionner

requete.open('GET',url,false);
La 2° solution pour rester dans le mode asynchrone (parallèle) qui donne à Ajax tout son atout, il faut appeler le script php "Delete_rla_cluster.php?id=..." qui effectue la suppression dans la procédure qui intercepte la réponse Ajax. Pour cela il ne faut plus appeler ce script par le HREF du lien mais par un appel Ajax.

Exemple:

Code : Tout sélectionner

function Verif_delete(i, id) // i pour la vérif et id pour la suppr après vérif et confirm { var piloting=document.getElementById("Piloting"+i).value; creerRequete(); var url='Verif_delete.php?Piloting='+piloting; requete.open('GET',url,true); requete.onreadystatechange = traiteReponse1(id); requete.send(null); } function traiteReponse1(id) { if(requete.readyState == 4) // Complete { if(requete.status == 200) { if(requete.responseText!="") { var pilote=requete.responseText; alert(pilote); if (pilote==1) { alert(" impossible to delete this profile:Please cretae a new profil with the same Piloting zone"); return false; } else if(pilote !=1) { if(confirm('are you sure you want to delete this profile?')) { // suppression confirmée => appel du script de suppression creerRequete(); var url='Delete_rla_cluster.php?id='+id; // le paramètre id est passé requete.open('GET',url,true); requete.onreadystatechange = traiteReponse2; requete.send(null); } else { return false; } } } } } } function traiteReponse2() { if(requete.readyState == 4) // Complete { if(requete.status == 200) { if(requete.responseText == 1) alert('Suppression effectuée'); else alert('Suppression non effectuée !'); } } }
Et pour le code HTML qui appelle ce script, on n'a plus besoin du lien HREF:
<img src="../img/actions/annulation_small.gif" border="0" alt="Supprimer" onclick="Verif_delete('<?php echo $i; ?>', '<?php echo $id;?>')" /a>
Pour plus d'infos sur le fonctionnement d'Ajax : https://developer.mozilla.org/fr/AJAX/Premiers_pas