AIDE pour la fonction onreadychange ajax!!!!

Petit nouveau ! | 6 Messages

05 mai 2009, 15:21

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!!!!

Mammouth du PHP | 1339 Messages

05 mai 2009, 20:20

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; } } } } } }
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Petit nouveau ! | 6 Messages

06 mai 2009, 10:49

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 !!!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

06 mai 2009, 11:36

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 1339 Messages

06 mai 2009, 12:33

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
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Petit nouveau ! | 6 Messages

06 mai 2009, 14:00

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

Mammouth du PHP | 1339 Messages

06 mai 2009, 14:03

Envoie le contenu de Verif_delete.php et je te montre un exemple !
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Petit nouveau ! | 6 Messages

06 mai 2009, 14:16

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;
						}
}

Mammouth du PHP | 1339 Messages

06 mai 2009, 14:22

Le contenu de Verif_delete.php
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Petit nouveau ! | 6 Messages

06 mai 2009, 14:25

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];

}
?>

Mammouth du PHP | 1339 Messages

06 mai 2009, 17:26

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);
}

?> 
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Petit nouveau ! | 6 Messages

06 mai 2009, 17:54

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 !!!

Mammouth du PHP | 1339 Messages

06 mai 2009, 18:01

Je te dis quoi faire et tu le fais pas ...
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

07 mai 2009, 01:17

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
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène