OVH Cloud OVH Cloud

[Ajax]MultiRequêtes

2 réponses
Avatar
Machaon
Bonjour à tous,

soit une fonction : AjaxDoIt(page, cible, typecible) qui m'execute la page
(en php) et me renvoi le résultat dans une cible (un div par exemple).
Elle fonctionne très bien. Voir en bas de message.

Mais lorsque je la lance 2 fois d'affilé, elle n'exécute pas les 2 requêtes
l'une après l'autre, ma fonction ne sait pas faire 2 req en même temps.


exemple :

<script ... >
AjaxDoIt('page1.php', 'd1', 'innerHTML');
AjaxDoIt('page2.php', 'd2', 'innerHTML');
</script>

<div id="d1"></div>
<div id="d2"></div>

sur le chargement de ma page uniquement le div d2 est rempli.

Comment adapter ma fonction pour l'exécution se fasse en parallèle ?!

Merci aux pros de Ajax... (si je me suis bien exprimé! ;-))

Machaon

PJ ma fonction :

/* --------------------------------------------------------
* Charge les donnes HTML renvoyes par le lien "phplink"
* dans le div ou l'input dont l'id est "pagetarget"
* --------------------------------------------------------
*/

var xmlHttp;
var ptarget;
var ttarget;

function AjaxDoIt(phplink, pagetarget, typetarget) {
ptarget = pagetarget;
ttarget = typetarget;
if (phplink.length > 0) {
xmlHttp=GetXmlHttpObject(stateChanged);
xmlHttp.open("GET", phplink, true);
xmlHttp.send(null);
} else {
switch(ttarget)
{
case "innerHTML" :
document.getElementById(pagetarget).innerHTML="";
break;
case "value" :
document.getElementById(pagetarget).value="";
break;
}
}
}

function stateChanged() {
if (document.getElementById(ptarget)==null) { return false; }
switch(ttarget)
{
case "innerHTML" :
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
document.getElementById(ptarget).innerHTML=xmlHttp.responseText;
}
break;
case "value" :
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
document.getElementById(ptarget).value=xmlHttp.responseText;
document.getElementById(ptarget).select();
}
break;
}
}

function GetXmlHttpObject(handler) {
var objXmlHttp=null;

if (navigator.userAgent.indexOf("Opera")>=0) {
alert("This example doesn't work in Opera");
return;
}

if (navigator.userAgent.indexOf("MSIE")>=0) {
var strName="Msxml2.XMLHTTP";
if (navigator.appVersion.indexOf("MSIE 5.5")>=0) {
strName="Microsoft.XMLHTTP";
}
try {
objXmlHttp=new ActiveXObject(strName);
objXmlHttp.onreadystatechange=handler;
return objXmlHttp;
} catch(e) {
alert("Error. Scripting for ActiveX might be disabled");
return;
}
}

if (navigator.userAgent.indexOf("Mozilla")>=0) {
objXmlHttp=new XMLHttpRequest();
objXmlHttp.onload=handler;
objXmlHttp.onerror=handler;
return objXmlHttp;
}
}

2 réponses

Avatar
Philippe Le Van
soit une fonction : AjaxDoIt(page, cible, typecible) qui m'execute la
page
(en php) et me renvoi le résultat dans une cible (un div par exemple).
Elle fonctionne très bien. Voir en bas de message.
Mais lorsque je la lance 2 fois d'affilé, elle n'exécute pas les 2
requêtes l'une après l'autre, ma fonction ne sait pas faire 2 req en
même temps.



Bonjour,

Je n'ai pas regardé le code dans le détail mais si tu veux que ta fonction
puisse être lancée 2 fois en parallèle, il faut que les variables de ta fonction
soient locales et non globales.

Quand tu mets le var ptarget; en dehors de ta fonction et que tu fais directement
ptarget ='toto' dans ta fonction, ptarget est globale.

il faut mettre directement var ptarget='toto' à l'intérieur de ta fonction
pour
que la variable soit locale à ta fonction. Comme ça tes appels ne se marcheront
pas sur les pieds.

Cordialement,
Philippe Le Van
--
tutorial drag and drop rico : http://www.kitpages.fr/ajax_dnd.php

Avatar
Machaon
"Philippe Le Van" a écrit dans le
message de news:
soit une fonction : AjaxDoIt(page, cible, typecible) qui m'execute la
page
(en php) et me renvoi le résultat dans une cible (un div par exemple).
Elle fonctionne très bien. Voir en bas de message.
Mais lorsque je la lance 2 fois d'affilé, elle n'exécute pas les 2
requêtes l'une après l'autre, ma fonction ne sait pas faire 2 req en
même temps.



Bonjour,

Je n'ai pas regardé le code dans le détail mais si tu veux que ta fonction
puisse être lancée 2 fois en parallèle, il faut que les variables de ta
fonction
soient locales et non globales.

Quand tu mets le var ptarget; en dehors de ta fonction et que tu fais
directement
ptarget ='toto' dans ta fonction, ptarget est globale.

il faut mettre directement var ptarget='toto' à l'intérieur de ta fonction
pour
que la variable soit locale à ta fonction. Comme ça tes appels ne se
marcheront
pas sur les pieds.

Cordialement,
Philippe Le Van
--
tutorial drag and drop rico : http://www.kitpages.fr/ajax_dnd.php



Je comprends, mais alors comment passer en paramètre à StatChanged les :
var xmlHttp;
var ptarget;
var ttarget;

alors quelle est appelée par :
xmlHttp=GetXmlHttpObject(stateChanged);

??

Si je fais ça :
xmlHttp=GetXmlHttpObject(stateChanged(xmlHttp, ptarget, ttarget));
ça ne marche plus :((

Merci pour votre aide.

Machaon