JS - Attendre qu'une action soit terminée ...

Fermé
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 - 18 août 2008 à 14:44
Tiller Messages postés 781 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 14 septembre 2008 - 18 août 2008 à 15:40
Bonjour,

je réalise en ce moment une petites appli ou je dois avoir un lien pour imprimer .

Hors, avant d'imprimer, je demande à l'utilisateur s'il veut également imprimer des infos supplémentaires sur la page.
Pour afficher ses infos en tant normal (sans vouloir imprimer), il y a un lien sur la page : "Infos supplémentaires ..." puis via un requête AJAX, les infos arrivent en dessous (donc sans rafraichissement).
Donc, imaginons qu'on clique sur oui a la suite de cette question, le contenu viens se placer en dessous et l'impression se lance !

En réalité, l'impression se lance avant que le contenu ne s'affiche !
Elle est appelée après mais se lance avant car pour charger la reqûete ajax il faut que le serveur renvoie les infos et ça prend du temps !

Est-ce que quelqu'un n'aurais pas un petit bout de code genre un return je sais pas quoi (je ne comprend pas très bien tout ça ... lol) ou un truc du genre de façon a dire que quand on a fini de l'instruction on appelle la suivante et uniquement quand la première et fini !

Voici mon code JS pour les interressés :

function imprime(id, nom, divid, num_id, titre, obj)
{
if(confirm("Voulez-vous aussi imprimer les informations sur les contacts/opérateurs ?"))
var bool = 1;//Si on clique sur oui, on affiche les infos supplémentaires
else
var bool = 2;//Si on clique sur non, on retire les infos supplémentaires

deploie(id, nom, 'contenu_info', divid, bool, num_id);//on appelle la fonction qui affiche ou non les infos supplémentaire
/*
Il faudrait une fonction ICI qui permet d'attendre que la fonction deploie soit fini !
*/
//Maintenant on imprime
var zi = document.getElementById(obj).innerHTML;
var f = window.open("", "ZoneImpr", "height=500, width=600,toolbar=0, menubar=0, scrollbars=1, resizable=1,status=0, location=0, left=10, top=10");
f.document.body.style.color = '#000000';
f.document.body.style.backgroundColor = '#FFFFFF';
f.document.body.style.padding = "10px";
f.document.title = titre;
f.document.body.innerHTML += "" + zi + "";
f.window.print();
f.window.close();
return true;
}

A+

Gaerebut

8 réponses

gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
18 août 2008 à 15:21
function deploie(id, nom, div_contenu, divid, bool, num_id)
{
if(bool == 1)
{
Lister(nom, div_contenu, divid, 'q');
$(id).innerHTML = "Réduire";
}
else
{
$(id).innerHTML = "Plus d'informations ...";
$('fenetre2_'+num_id).innerHTML="";
}
}
1
Tiller Messages postés 781 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 14 septembre 2008 210
18 août 2008 à 15:25
Lister..
1
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
18 août 2008 à 15:27
var xmlHttp

function Lister(str, page, id, variable)
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Votre navigateur ne supporte pas le HTTP Request")
return
}
var url="./pages/"+page+".php"

if(variable == 'q')
url=url+"?q="+str
else if(variable == 'p')
url=url+"?p="+str

url=url+"&sid="+Math.random()

if(id != 0)
xmlHttp.onreadystatechange=getStateChanged(id);
else
xmlHttp.onreadystatechange=getStateChanged(0);
xmlHttp.open("GET",url,true)
xmlHttp.send(null)

}
1
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
18 août 2008 à 15:29
Pardon j'ai oublié la suite de l'Ajax !

function getStateChanged(id)
{
if (id != 0)
{
if (typeof(id) === 'string')
{
id = document.getElementById(id);
}
return function()
{
if (xmlHttp.readyState==4)
{
id.innerHTML = xmlHttp.responseText;
}
}
}
else
{

return function()
{
if (xmlHttp.readyState==4)
{
act.destroy();
wm = new UI.WindowManager({ container: 'gauche_absolute' });
act = new UI.Window({height: 480, width: 430, top: 60, left: 60, windowManager: wm}).show();
act.maximize();
act.setContent(xmlHttp.responseText);
}
}
}
}

function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
//Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
}
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
18 août 2008 à 15:35
var xmlHttp

function Lister(str, page, id, variable)
{ 
	xmlHttp=GetXmlHttpObject()
	if (xmlHttp==null)
	{
		alert ("Votre navigateur ne supporte pas le HTTP Request")
		return
	}
	var url="./pages/"+page+".php"
	
	if(variable == 'q')
		url=url+"?q="+str
	else if(variable == 'p')
		url=url+"?p="+str
		
	url=url+"&sid="+Math.random()
	
	if(id != 0)
		xmlHttp.onreadystatechange=getStateChanged(id);
	else
		xmlHttp.onreadystatechange=getStateChanged(0);
	xmlHttp.open("GET",url,true)
	xmlHttp.send(null)
	
}

function getStateChanged(id)
{
	if (id != 0)
	{
		if (typeof(id) === 'string')
		{
			id = document.getElementById(id);
		}
		return function() 
		{
			if (xmlHttp.readyState==4)
			{
				id.innerHTML = xmlHttp.responseText;
			}
		}
	}
	else
	{
		
		return function() 
		{
			if (xmlHttp.readyState==4)
			{
				act.destroy();
				wm = new UI.WindowManager({ container: 'gauche_absolute' });
				act = new UI.Window({height: 480, width: 430, top: 60, left: 60, windowManager: wm}).show();
				act.maximize();
				act.setContent(xmlHttp.responseText);
			}
		}
	}
}

function GetXmlHttpObject()
{
	var xmlHttp=null;
	try
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}
	catch (e)
	{
		//Internet Explorer
		try
		{
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return xmlHttp;
}

 
function filtre(id, etat)
{	
	if($('indicateur_ville').value != '*' && id)
		var requete = "SELECT dess.id AS 'Id', dess.id_operateur AS 'Id_Operateur', dess.frequence, dest.ville AS 'Ville', o.nom AS 'Operateur', tf.libelle AS 'Type_Frequence', mt.libelle AS 'Mode_Transport' FROM desserte dess,operateur o, destination dest, type_frequence tf, mode_transport mt WHERE dest.id = dess.id_destination AND o.id = dess.id_operateur AND tf.id = dess.id_type_frequence AND mt.id = dess.id_mode_transport AND mt.visible = 1 AND mt.visible = 1 AND id_destination = '" + $('indicateur_ville').value + "'";
	else
		var requete = "SELECT dess.id AS 'Id', dess.id_operateur AS 'Id_Operateur', dess.frequence, dest.ville AS 'Ville', o.nom AS 'Operateur', tf.libelle AS 'Type_Frequence', mt.libelle AS 'Mode_Transport' FROM desserte dess,operateur o, destination dest, type_frequence tf, mode_transport mt WHERE dest.id = dess.id_destination AND o.id = dess.id_operateur AND tf.id = dess.id_type_frequence AND mt.id = dess.id_mode_transport AND mt.visible = 1 AND mt.visible = 1";
		
	for (i=0;i<=n;i++)
	{
		if (TabId[i]==id)//Si etat = 0, la ligne correspondant au tableau JS prend la valeur 0
		{
			if (!etat)
			{
				TabVisible[i] = 0;
			}
			else//Si etat = 1, la ligne correspondant au tableau JS prend la valeur 1
			{
				TabVisible[i] = 1;
			}
		}
		if(TabVisible[i] == 0)
		{
			requete +=  " AND dess.id_mode_transport <> " + TabId[i];
		}
	}
	
	if($('indicateur_ville').value == '*')//Si la valeur de l'input hidden est égal a une etoile (=tout), on va tri toutes les dessertes par le nom de la ville
		requete += " ORDER BY Ville";
	
	if($('indicateur_ville').value != '') //Vérification: Si on clique sur les filtres sans avoir cliqué sur une villes, les critères s'appliquent mais rien ne s'affiche (car aucune ville choisi)
		Lister(requete,'contenu', 0, 'p');
}  

function fenetre()
{
	wm = new UI.WindowManager({ container: 'gauche_absolute' });
	act = new UI.URLWindow({height: 480, width: 430, top: 60, left: 60, url: './pages/accueil.html', windowManager: wm}).show();
}


function deploie(id, nom, div_contenu, divid, bool, num_id)
{
	if(bool == 1)
	{
	Lister(nom, div_contenu, divid, 'q');
	$(id).innerHTML = "Réduire";
	}
	else
	{
	$(id).innerHTML = "Plus d'informations ...";
	$('fenetre2_'+num_id).innerHTML="";
	}
}

function pre_imprime(id, nom, divid, num_id, titre, obj) 
{
if(confirm("Voulez-vous aussi imprimer les informations sur les contacts/opérateurs ?"))
	var bool = 1;//Si on clique sur oui, on affiche les infos supplémentaires
else
	var bool = 2;//Si on clique sur non, on retire les infos supplémentaires

deploie(id, nom, 'contenu_info', divid, bool, num_id);//on appelle la fonction qui affiche ou non les infos supplémentaire


setTimeout("imprime(" + titre + ", " + obj + ")",3000);
}

function imprime(titre, obj)
{
//Maintenant on imprime
var zi = document.getElementById(obj).innerHTML;
var f = window.open("", "ZoneImpr", "height=500, width=600,toolbar=0, menubar=0, scrollbars=1, resizable=1,status=0, location=0, left=10, top=10");
f.document.body.style.color = '#000000';
f.document.body.style.backgroundColor = '#FFFFFF';
f.document.body.style.padding = "10px";
f.document.title = titre;
f.document.body.innerHTML += "" + zi + "";
f.window.print();
f.window.close();
return true;
} 
1
Tiller Messages postés 781 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 14 septembre 2008 210
18 août 2008 à 15:40
Tu remplaces
setTimeout("imprime(" + titre + ", " + obj + ")",3000);

par

tmpTitre = titre;
tmpObj = obj;







Et la place de ta fonction tu met celle la:

function getStateChanged(id)
{
	if (id != 0)
	{
		if (typeof(id) === 'string')
		{
			id = document.getElementById(id);
		}
		return function() 
		{
			if (xmlHttp.readyState==4)
			{
				id.innerHTML = xmlHttp.responseText;
				imprime();
			}
		}
	}
	else
	{
		
		return function() 
		{
			if (xmlHttp.readyState==4)
			{
				act.destroy();
				wm = new UI.WindowManager({ container: 'gauche_absolute' });
				act = new UI.Window({height: 480, width: 430, top: 60, left: 60, windowManager: wm}).show();
				act.maximize();
				act.setContent(xmlHttp.responseText);
				imprime();
			}
		}
	}
}












Et tu met:

function imprime()
{
//Maintenant on imprime
var zi = document.getElementById(tmpObj).innerHTML;
var f = window.open("", "ZoneImpr", "height=500, width=600,toolbar=0, menubar=0, scrollbars=1, resizable=1,status=0, location=0, left=10, top=10");
f.document.body.style.color = '#000000';
f.document.body.style.backgroundColor = '#FFFFFF';
f.document.body.style.padding = "10px";
f.document.title = tmpTitre;
f.document.body.innerHTML += "" + zi + "";
f.window.print();
f.window.close();
return true;
}


Sa devrait etre bon

1
Tiller Messages postés 781 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 14 septembre 2008 210
18 août 2008 à 15:20
Je peux avoir la fonction deploie? merci =)
0
Tiller Messages postés 781 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 14 septembre 2008 210
18 août 2008 à 15:32
Tu pourrais pas utiliser la balide code pour conservé les tabulations? Sa donne pas envie de lire la..
0