Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Ajax] Instances multiples

3 réponses
Avatar
Machaon
Bonjour à tous,

j'utilise Ajax depuis peut, j'ai un code qui fonctionne super bien lorsque
je lance une requête.
Mais je me trouve actuellement confronté au problème suivant : je lance 2
requêtes coup sur coup et la, il ne se passe plus rien.
Après m'être documenté sur le sujet (merci google) j'ai lu qu'une des façons
de contourner le problème était d'utiliser les "inner function". J'ai un
bout de code qui est cencé marché, mais qq chose cloche !

Avez vous déjà eu une expérience sur le sujet ?
Merci de votre aide.

Machaon

Voici le code en question :
/* --------------------------------------------------------*/
/* Debut de code */
/* --------------------------------------------------------*/

var xmlHttp;
var ptarget;
var ttarget;

/* --------------------------------------------------------
* Charge les donnes HTML renvoyes par le lien "phplink"
* dans le div ou l'input dont l'id est "pagetarget"
* --------------------------------------------------------
*/
function AjaxDoIt(phplink, pagetarget, typetarget) {
ptarget = pagetarget;
ttarget = typetarget;
if (phplink.length > 0) {
// xmlHttp=GetXmlHttpObject(stateChanged);
xmlHttp=GetXmlHttpObject();
xmlHttp.open("GET", phplink, true);

xmlHttp.onreadystatechange = function() {
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;
}
}

xmlHttp.send(null);
} else {
switch(ttarget)
{
case "innerHTML" :
document.getElementById(pagetarget).innerHTML="";
break;
case "value" :
document.getElementById(pagetarget).value="";
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;
}
}

/* --------------------------------------------------------*/
/* Fin de code */
/* Exemple d'appel */
/* --------------------------------------------------------*/

[...]
// Ici, j'appele deux fois la fonction AjaxDoIt() d'affilé, et il n'aime
pas....
// Alors qu'une seule fois, ça marche !
AjaxDoIt('PC1_actions.php?action=setqty&ean='+ean, 'user_message',
'innerHTML');

AjaxDoIt('PC1_actions.php?action=getcde&numcde='+cde, 'listcde',
'innerHTML');



PS : Sacré tartine ! Merci d'avoir lu jusqu'en bas ;-)

3 réponses

Avatar
BertrandB
Bonjour à tous,

j'utilise Ajax depuis peut, j'ai un code qui fonctionne super bien lors que
je lance une requête.
Mais je me trouve actuellement confronté au problème suivant : je l ance 2
requêtes coup sur coup et la, il ne se passe plus rien.
Après m'être documenté sur le sujet (merci google) j'ai lu qu'une des façons
de contourner le problème était d'utiliser les "inner function". J' ai un
bout de code qui est cencé marché, mais qq chose cloche !

Avez vous déjà eu une expérience sur le sujet ?
Merci de votre aide.

Machaon

Voici le code en question :
/* --------------------------------------------------------*/
/* Debut de code */
/* --------------------------------------------------------*/

var xmlHttp;
var ptarget;
var ttarget;

/* --------------------------------------------------------
* Charge les donnes HTML renvoyes par le lien "phplink"
* dans le div ou l'input dont l'id est "pagetarget"
* --------------------------------------------------------
*/
function AjaxDoIt(phplink, pagetarget, typetarget) {
ptarget = pagetarget;
ttarget = typetarget;
if (phplink.length > 0) {
// xmlHttp=GetXmlHttpObject(stateChanged);
xmlHttp=GetXmlHttpObject();
xmlHttp.open("GET", phplink, true);

xmlHttp.onreadystatechange = function() {
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;
}
}

xmlHttp.send(null);
} else {
switch(ttarget)
{
case "innerHTML" :
document.getElementById(pagetarget).innerHTML="";
break;
case "value" :
document.getElementById(pagetarget).value="";
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;
}
}

/* --------------------------------------------------------*/
/* Fin de code */
/* Exemple d'appel */
/* --------------------------------------------------------*/

[...]
// Ici, j'appele deux fois la fonction AjaxDoIt() d'affilé, et il n'a ime
pas....
// Alors qu'une seule fois, ça marche !
AjaxDoIt('PC1_actions.php?action=setqty&ean='+ean, 'user_message',
'innerHTML');

AjaxDoIt('PC1_actions.php?action=getcde&numcde='+cde, 'listcde',
'innerHTML');



PS : Sacré tartine ! Merci d'avoir lu jusqu'en bas ;-)



Essaie de définir xmlHttp,ptarget et ttarget comme variable locale j'ai

l'impression que tu te marches sur les pieds

var xmlHttp; A suprimer
var ptarget; A supprimer
var ttarget; A supprimer
...

function AjaxDoIt(phplink, pagetarget, typetarget) {
var xmlHttp;
var ptarget; A mon avis intuile remplacer dans le corps de la
fonction par page target

var ttarget; Aussi inutile
ptarget = pagetarget;
ttarget = typetarget;


Avatar
Machaon
"BertrandB" a écrit dans le message de news:
44abf544$0$882$
Bonjour à tous,

j'utilise Ajax depuis peut, j'ai un code qui fonctionne super bien lorsque
je lance une requête.
Mais je me trouve actuellement confronté au problème suivant : je lance 2
requêtes coup sur coup et la, il ne se passe plus rien.
Après m'être documenté sur le sujet (merci google) j'ai lu qu'une des
façons
de contourner le problème était d'utiliser les "inner function". J'ai un
bout de code qui est cencé marché, mais qq chose cloche !

Avez vous déjà eu une expérience sur le sujet ?
Merci de votre aide.

Machaon

Voici le code en question :
/* --------------------------------------------------------*/
/* Debut de code */
/* --------------------------------------------------------*/

var xmlHttp;
var ptarget;
var ttarget;

/* --------------------------------------------------------
* Charge les donnes HTML renvoyes par le lien "phplink"
* dans le div ou l'input dont l'id est "pagetarget"
* --------------------------------------------------------
*/
function AjaxDoIt(phplink, pagetarget, typetarget) {
ptarget = pagetarget;
ttarget = typetarget;
if (phplink.length > 0) {
// xmlHttp=GetXmlHttpObject(stateChanged);
xmlHttp=GetXmlHttpObject();
xmlHttp.open("GET", phplink, true);

xmlHttp.onreadystatechange = function() {
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;
}
}

xmlHttp.send(null);
} else {
switch(ttarget)
{
case "innerHTML" :
document.getElementById(pagetarget).innerHTML="";
break;
case "value" :
document.getElementById(pagetarget).value="";
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;
}
}

/* --------------------------------------------------------*/
/* Fin de code */
/* Exemple d'appel */
/* --------------------------------------------------------*/

[...]
// Ici, j'appele deux fois la fonction AjaxDoIt() d'affilé, et il n'aime
pas....
// Alors qu'une seule fois, ça marche !
AjaxDoIt('PC1_actions.php?action=setqty&ean='+ean, 'user_message',
'innerHTML');

AjaxDoIt('PC1_actions.php?action=getcde&numcde='+cde, 'listcde',
'innerHTML');



PS : Sacré tartine ! Merci d'avoir lu jusqu'en bas ;-)



Essaie de définir xmlHttp,ptarget et ttarget comme variable locale j'ai

l'impression que tu te marches sur les pieds

var xmlHttp; A suprimer
var ptarget; A supprimer
var ttarget; A supprimer
...

function AjaxDoIt(phplink, pagetarget, typetarget) {
var xmlHttp;
var ptarget; A mon avis intuile remplacer dans le corps de la
fonction par page target

var ttarget; Aussi inutile
ptarget = pagetarget;
ttarget = typetarget;




Oui je sais, je me doutais que ça allait se voir, mais c'est une version
simplifiée du code... qui n'est donc pas optimale !

Merci

Avatar
BertrandB



Oui je sais, je me doutais que ça allait se voir, mais c'est une vers ion
simplifiée du code... qui n'est donc pas optimale !

Merci




As tu testé en déplaçant les déclarations de ttarget ptarget et x mlHttp
dans la fonction AjaxdoIt afin de respecter ce que dit cet article ?

<a href="http://www.xml.com/cs/user/view/cs_msg/2815">A threadsafe
implementation for XMLHTTPRequest</a>