récuperer dans une méthode une variable d'une fonction

Eléphant du PHP | 87 Messages

25 févr. 2010, 15:50

Bonjour,
Je fais un script en javaScript qui via Ajax récupère une chaine de caractère via un script php/sql qui se connecte à mysql
La chaine est retournée et traitée via des regExps et les valeurs affichées via le DOM
Voici mon code :

Code : Tout sélectionner

ObjectAjax=function(){ this.req=null; if (window.ActiveXObject) { this.req = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { this.req = new XMLHttpRequest(); this.req.overrideMimeType('text/xml'); } } ObjectAjax.prototype.exReq=function(){ this.load=null;//propriété issue de la fonction this.req.open('GET','ajax.php',true); this.req.onreadystatechange=function(){ var readyState = this.readyState; if (readyState == 4) { alert(this.responseText) } } this.req.send(null); } ObjectAjax.prototype.returnDataBase=function() { this.dataBase=dataBase=new Array(); var exReg=new RegExp("=[a-zA-Z0-9/.: ]*\]","g");//erreur caractere facultatif ignoré + pb <> extension jpg jpeg ou particularité javaScript/ajax var chaine=this.texte.match(exReg).toString(); //alert(chaine); var exReg2=new RegExp(",+","g"); var tab=chaine.split(exReg2); //extraction des ids //var exRegID=new RegExp("#[0-9]*#","g"); //var chaineID=str3.match(exRegID).toString(); //alert(tabID[i].substring(1,tabID[i].length-1)); var fraction = new Array(); var newtab = new Array(); //var tabID=chaineID.split(exReg2); //var tableau = new Array(); for (var i=0; i<tab.length; i++) { fraction[i]="'"+tab[i].substring(1,tab[i].length-1)+"'"; //ch="tableau"+i+"= new Array('"+fraction[i]+"');"; //eval(ch); } for (var j=0; j<18; j++) { newtab[j]=fraction.slice(0,5); var unechaine=newtab[j]+""; ch="this.dataBase["+j+"]= new Array("+unechaine+");"; eval(ch); fraction.splice(0,5); } } ObjectAjax.prototype.createChampsJs=function() { this.dataPiste=dataPiste=new Array(); this.dataGrandTitre=dataGrandTitre=new Array(); this.dataImage=dataImage=new Array(); this.dataMiniature=dataMiniature=new Array(); for (var k=0; k<18; k++) { //alert(dataBase[k][1]); this.dataPiste[this.dataBase[k][1]]=this.dataBase[k][1]; this.dataGrandTitre[this.dataBase[k][2]]=this.dataBase[k][2]; this.dataImage[this.dataBase[k][3]]=this.dataBase[k][3]; this.dataMiniature[this.dataBase[k][4]]=this.dataBase[k][4]; } } ObjectAjax.prototype.tabNamePiste=function() { this.TabPisteValue=TabPisteValue=new Array(); this.indice=indice=0; for(var val in this.dataPiste){ this.indice++; this.TabPisteValue[this.indice]=this.dataPiste[val]; } } ObjectAjax.prototype.createDataBaseJs=function(){ this.myDataBase=myDataBase=new Array; for (var id=0; id<18; id++) { for(var numCh=0;numCh<5;numCh++){ this.myDataBase[id]=new Array(this.dataBase[id][0],this.dataBase[id][1],this.dataBase[id][2],this.dataBase[id][3],this.dataBase[id][4]); } } }
et ma page ou le script est appelé ,c'est une sorte de méthode Main comme en java ...
function static_void_Main(){
var obAjax = new ObjectAjax();
obAjax.exReq();

//obAjax.returnDataBase();
/*obAjax.createChampsJs();
obAjax.createDataBaseJs();
obAjax.tabNamePiste();
obAjax.IdPosition();
obAjax.afficheTableauAccueil();
obAjax.clickUrl;*/

}
//newtimer = setTimeout("static_void_Main()",1000);
window.onload=static_void_Main;

tout fonctionne vu que j'ai fais le script en procédural et la je fais du refractoring en javaScript orienté objet

Donc mon soucis se situe au niveau de cette méthode:

Code : Tout sélectionner

ObjectAjax.prototype.exReq=function(){ this.load=null;//propriété issue de la fonction this.req.open('GET','ajax.php',true); this.req.onreadystatechange=function(){ var readyState = this.readyState; if (readyState == 4) { alert(this.responseText)//<--- retourner cette variable là à la méthode } } this.req.send(null); }
this.req.onreadystatechange m'oblige à appeler une fonction
je suis pas loin du but retourner this.responseText à la méthode et initialiser this.load
Mais là je coince je n'arrive pas à l'aide d'un return à retouner quoique se soit ,faire une variable globale etc
Quelqu'un a t'il une idée Merci :wink:

ViPHP
ViPHP | 5462 Messages

25 févr. 2010, 16:12

c'est pas plutôt :

Code : Tout sélectionner

var readyState = this.req.readyState; if (readyState == 4) { alert(this.req.responseText) }
et un petit coup de JSLint sera le bienvenue :wink:

je te conseil aussi de pas utilise prototype, plutôt faire

Code : Tout sélectionner

var Object = { test:'blabla', func:function(){ alert('ok'); } }

Eléphant du PHP | 87 Messages

25 févr. 2010, 16:30

non this dans le corps de la fonction représente this.req ,this objet courant
merci pour jSLint je connaissais pas mais pas d'erreurs majeurs
je prefere utiliser var mytab=new Array(); que var mytab[];
il y a juste une erreur pour les prorpiété non paramétré
this.pr=pr=null et c'est this.pr=null cela dit pr=null va aussi
pourquoi ne pas utiliser prototype?
enfin ma question reste ouverte :priere:

ViPHP
ViPHP | 5462 Messages

25 févr. 2010, 16:45

et si tu mettais une autre fonction dans ton object

Code : Tout sélectionner

this.req.onreadystatechange = this.statechange //ensuite ObjectAjax.prototype.statechange=function(){ blabla }
sinon pour jslint c'est plus
var mytab=new Array() == var mytab= [];

et pour le prototype c'est plus parce que maintenant javascript est un peu tout seul dans cette façon de programmer, et comme la POO commence a bien évoluer dans le monde web c'est plus pour avoir une cohérence avec le reste (mais c'est un avis personnel bien-sur :wink: )

Eléphant du PHP | 87 Messages

25 févr. 2010, 17:12

Je fais du java aussi et de toute façon javaScript "simule" la poo dans un sens si on compare avec java
c'est un langage objet diffèrent des langages objets classiques bref c'est mon avis
donc je ne les compare pas
mais je comprends pas vraiment ce que tu veux faire

this.req.onreadystatechange = this.statechange



mais en dehors de la fonction c'est ça this.req.onreadystatechange = this.req.statechange
or onreadystatechange est un boléen je pense qui appelle une fonction
et là tu appelle une propriété this.statechange qui est donc this.req.statechange
et un méthode dans une méthode en java en tout cas c'est pas possible
en javascript je pense pas non plus
en tout cas merci pour ton aide :)

ViPHP
ViPHP | 5462 Messages

25 févr. 2010, 17:34

tu l'envoies a quel fonction le contenu ?
parce que la tu lance toutes les fonction a suivre, dans se cas la il va falloir se mettre en mode synchrone :

Code : Tout sélectionner

this.req.open('GET','test.php',false);

Code : Tout sélectionner

var ObjectAjax=function(){ this.req=null; if (window.ActiveXObject) { this.req = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { this.req = new XMLHttpRequest(); this.req.overrideMimeType('text/xml'); } }; ObjectAjax.prototype.exReq=function(){ this.load=null; this.req.open('GET','test.php',false); this.req.send(null); this.load = this.req.responseText; }; var obj = new ObjectAjax(); obj.exReq(); alert(obj.load); //hello

Eléphant du PHP | 87 Messages

25 févr. 2010, 18:39

le contenu va à une méthode ensuite les autres traitent ce contenu
il n'y a donc qu'une requête vers le script php donc synchrone suffit
mais la récupération de this.responseText a rien avoir avec ça
C'est dingue je trouve que je ne trouve nul part un exemple de code avec les méthodes ajax de connexion orienté objet :(

ViPHP
ViPHP | 5462 Messages

25 févr. 2010, 18:41

oui synchrone (async = false), la tu étais en asynchrone (async = true)

Eléphant du PHP | 87 Messages

25 févr. 2010, 18:53

ah merci béh ça marche aussi lol

Eléphant du PHP | 87 Messages

26 févr. 2010, 00:03

Personne a une petite idée??? :priere:

ViPHP
ViPHP | 5462 Messages

26 févr. 2010, 01:17

mais t'as essayé en synchrone ?
parce que en asynchrone tu risques pas de récupérer ta valeur a la méthode suivante :shock:

Eléphant du PHP | 87 Messages

26 févr. 2010, 10:11

j'ai essayé bien sûr ,le probleme n'est pas si ça récupere une valeur c'est comment la récuperer
vu que l' alert l'affiche
peu importe que se soit synchrone ou asynchrone les 2 fonctionnent vu qui qu'il n'y a qu'une requête ajax
en procédurale ça marche de toute façon
je vois une chose l'absence de doc sur le net
on dit ajax ajax et pas de doc d'ajax en poo
je suis sur un autre forum et pas de réponse
mais j'ai trouvé la solution
j'ai appris la poo avec actionscript 3 je vais vite passé à flex
as3 est comme java coté client ça m'ettonerait que je rencontre ce genre de probleme
c'est un vrai langage de poo
pour moi c'est net ,si on veut faire de la poo c'est java et as3 ou même c# et .NET
en tout cas merci pour ton aide :)

ViPHP
ViPHP | 5462 Messages

26 févr. 2010, 13:30

mais la c'est pas de la POO mais de la POP (programmation orienté prototype) :wink:
ja faire un tour dans les source de Dojo qui lui est en object http://www.dojotoolkit.org/

Eléphant du PHP | 87 Messages

26 févr. 2010, 13:50

oui mais tout simule la poo pseudo classe etc
merci je vais aller jeter un coup d'œil à ta source
je suis têtu lol

ViPHP
ViPHP | 5462 Messages

26 févr. 2010, 13:54

si j'ai bien compris tu voudrais mettre le "responseText" dans "this.load" ?
Apres dans quelle fonction tu récupérer le responseText pour le manipuler ?