AIDE pour la fonction onreadychange ajax!!!!

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : AIDE pour la fonction onreadychange ajax!!!!

par sadeq » 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

par Elie » 06 mai 2009, 18:01

Je te dis quoi faire et tu le fais pas ...

par virus321 » 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 !!!

par Elie » 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);
}

?> 

par virus321 » 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];

}
?>

par Elie » 06 mai 2009, 14:22

Le contenu de Verif_delete.php

par virus321 » 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;
						}
}

par Elie » 06 mai 2009, 14:03

Envoie le contenu de Verif_delete.php et je te montre un exemple !

par virus321 » 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

par Elie » 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

par zeus » 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.

par virus321 » 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 !!!

par Elie » 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; } } } } } }

AIDE pour la fonction onreadychange ajax!!!!

par virus321 » 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!!!!