IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Tableau dynamique (Ajax)


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut Tableau dynamique (Ajax)
    Bonjour,

    J'ai besoin de faire un apel Ajax pour reprendre des données d'une bdd. Sans problème, je fait cela. Quand mon xhr change d'état, j'appel la fonction suivante (xhr est donc un élément XMLHttpRequest()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function arrayFromXML(xhr)
    {
    	var tab = new Array();
    	if (xhr.readyState==4)
    	{
    		if (xhr.status==200)
    		{
    			var array = xhr.responseXML.firstChild.childNodes;
    			for(var i = array.length - 1 ; i >=0; i--)
    			{
              		tab[array[i].getAttribute("type")]=array[i].getAttribute["value"];
              	}
             }
        }
        return tab;
    }
    mais voila, tabe est vide. j'avoue que c'est obscure pour moi. est ce que qqun serait pourquoui tab est vide ?

    PS : mon apel XHR renvoi un XML de type :
    <racine>
    <element type="toto" value="prout" />
    </racine>

  2. #2
    Membre habitué Avatar de Capt. Flame
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 196
    Points
    196
    Par défaut
    Si tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert(xhr.responseXML.firstChild.childNodes.length)
    qu'est-ce que ça te donne comme résultat?

  3. #3
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut
    Citation Envoyé par Capt. Flame Voir le message
    Si tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert(xhr.responseXML.firstChild.childNodes.length)
    qu'est-ce que ça te donne comme résultat?
    ça me donne trois, normale mon XML à trois noeud (après la racine)
    c'est quand même bizarre, j'ai simplifié ma fonction au maximum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function arrayFromXML(xhr)
    {
    	var tab = new Array();
    	if (xhr.readyState==4)
    	{
    		if (xhr.status==200)
    		{
    			var array = xhr.responseXML.firstChild.childNodes;
    			for(var i = array.length - 1 ; i >=0; i--)
    			{
              		var key = array[i].getAttribute("type");
              		var value = array[i].getAttribute("value");
              		tab[key]=value;
              	}
             }
        }
        return tab;
    }
    mais l'objet retoruné est toujours un tableau de longueur 0

  4. #4
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    Et si tu fais alert(array[0])?

    Parce que xhr.responseXML.firstChild.childNodes retourne un NodeList, et non un tableau, donc je suis pas sur que tu puisse créer un tableau directement de cette facon.

  5. #5
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut
    Citation Envoyé par DoubleU Voir le message
    Et si tu fais alert(array[0])?
    ave firefox ça m'affiche je trouve cela normal
    mais je rempli mon tableau à partir des attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     array[i].getAttribute("value");
    Parce que xhr.responseXML.firstChild.childNodes retourne un NodeList, et non un tableau, donc je suis pas sur que tu puisse créer un tableau directement de cette facon.[/QUOTE]ben mon tableau je le construit !

  6. #6
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    Autant pour moi, j'avais confondu ton array et ton tab (lundi matin, toussa )

    Quand tu dis que ton tableau est vide, tu le regardes ou? avant le return ou apres? Parce qu'on ne peut pas retourner de valeur dans le callback sur onreadystatechange...

    PS: tu peux faire voir le code appelant ta fonction?

  7. #7
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut
    Citation Envoyé par DoubleU Voir le message
    Autant pour moi, j'avais confondu ton array et ton tab (lundi matin, toussa )

    Quand tu dis que ton tableau est vide, tu le regardes ou? avant le return ou apres? Parce qu'on ne peut pas retourner de valeur dans le callback sur onreadystatechange...

    PS: tu peux faire voir le code appelant ta fonction?
    j'ai mis le code plus haut

    je l'ai changé depuis, je suis passé sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    xhr2 = newAjaxInstance();
    				xhr2.onreadystatechange = function() 
    				{ 
    					if (xhr2.readyState==4)
    					{
    						if (xhr2.status==200)
    						{
    							var array = xhr2.responseXML.firstChild.childNodes;
    							for(var i = array.length - 1 ; i >=0; i--)
    							{
             						var key = array[i].getAttribute("type");
    	         					var value = array[i].getAttribute("value");
    	         					info[key]=value;
    	         					alert(key+' '+value);
    	         				}
    	       				}
             			}
             		}       		
            		url='web-services/retrieve-companie-info.php?id='+getURLParam('id');
            		xhr2.open("GET",url,true);
            		xhr2.send(null);
            		alert(info.length);
    mais toujours en vain
    PS : newAjaxInstance() me retourne un objet XMLHttpRequest
    bine sur j'ai déclaré, info, dans mon script,comme étant un tableau

  8. #8
    Membre habitué Avatar de Capt. Flame
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 196
    Points
    196
    Par défaut
    Je crois que je vois. Ça vient de ton utilisation du Array. Un n'utilise pas une clé mais bien un indexe. Tu ne peux pas écrire, par exemple: "myArray['toto'] = 10;

    Donc, tu devrais essayer de modifier ton code comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var value = array[i].getAttribute("value");
    info.push(value);
    Voilà pour l'utilisation du Array. Mais je ne crois pas que le Array réponde parfaitement à ton besoin. Si je comprend bien comment tu tentes de le fabriquer, j'ai l'impression qu'à la fin tu aimerais récupérer tes valeurs en utilisant la clé. À ce moment n'utilise pas de Array, utilise un "JSON vide" que tu pourras peupler dans ta boucle... Donc, déclare info comme ceci:
    Et tout devrait fonctionner... Parcontre, si tu veux boucler dans tes valeurs ce sera différent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(i in info){
        // i represente ta key et info[i] represente ta valeur
        alert(info[i]);
    }
    Et info.length ne fonctionnera pas 'a moins que tu le favriques toi même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var info = {};
    info.length = 0;
     
    for(var i = array.length - 1 ; i >=0; i--)
    {
    	var key = array[i].getAttribute("type");
    	var value = array[i].getAttribute("value");
    	info[key]=value;
    	info.length++;
    }

  9. #9
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    Si, son code est bon, on peut utliser un tableau associatif de cette facon.

    Dans le dernier code que t'as mis, il se passe quoi exactement?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xhr2.send(null);
    alert(info.length);
    Ca, ca te donnera toujours 0, parce que tu utilises une requete asynchrone, docn des que javascript exécute ton send, il passe à l'instruction suivante, et comme l'appel ajax n'as pas eu le temps de se faire, le tableau info sera vide.

    Si l'autre alert passe correctement, normalement c'est bon, t'as juste à mettre ton traitement dans ta fonction sur onreadystatechange, et pas apres l'appel à send.

  10. #10
    Membre habitué Avatar de Capt. Flame
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 196
    Points
    196
    Par défaut
    Ca, ca te donnera toujours 0, parce que tu utilises une requete asynchrone
    Évidemment si tu essaie d'avoir le contenu d'un objet qui n'a pas encore été créé ça ne fonctionne pas!!! Mais c'est comme ça tout le temps, pas seulement dans cet exemple...

  11. #11
    Membre habitué Avatar de Capt. Flame
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 196
    Points
    196
    Par défaut
    Si, son code est bon, on peut utliser un tableau associatif de cette facon.
    Je ne suis pas certain de te comprendre, tu veux dire que son utilisation du Array() de cette façon est une bonne façon?

    Effectivement, je remarque que le résultat de sa façon de construire le code donne sensiblement le même résultat et que ce n'est effectivement pas la source du problème. Mais je ne crois pas que ce soit une bonne façon d'utiliser un Array(). Voici un p'tit bout de code qui prouve mon point:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var info = Array();
    info['test1'] = 'value1';
    info['test2'] = 'value2';
    info['test3'] = 'value3';
    alert(info.length)// Retournera toujours 0
    Dans le cas d'une utilisation "valable" du Array(), il retournerait 3.

  12. #12
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    Je ne suis pas certain de te comprendre, tu veux dire que son utilisation du Array() de cette façon est une bonne façon?
    ...
    Je sais pas si c'est une bonne façon ou pas, peu importe, c'est juste une façon qui existe. Tant que tu le fais en toute connaissance de cause et que tu ne vas pas chercher le .length dans un tableau utilisé associativement, pourquoi ca serait une mauvaise utilisation?


    Évidemment si tu essaie d'avoir le contenu d'un objet qui n'a pas encore été créé ça ne fonctionne pas!!! Mais c'est comme ça tout le temps, pas seulement dans cet exemple...
    L'objet a été créé justement. Mais c'est par le fait que la requête est asynchrone que la longueur sera toujours égale à 0. Si tu utilises le même code mais passe la requete en synchrone, la longueur vaudra 3.
    La nuance cause parfois des problèmes...

  13. #13
    Membre habitué Avatar de Capt. Flame
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 196
    Points
    196
    Par défaut
    La nuance cause parfois des problèmes
    Effectivement... Le fait de travailler en AJAX demande de bien faire son analyse...

    Pour ce qui est du Array(), mon point est simplement que ça ne vaut pas la peine de déclarer un objet d'un certain type si le but n'est pas d'utiliser le dit type...

    Mais bon, on s'éloigne là, désolé...

  14. #14
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut
    oki merci à vous deux
    je teste la façon j-son demain et je vs dis ce qu'il en est

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ZF 1.9] Tableau dynamique (universel) en Ajax avec Jquey
    Par noiser007 dans le forum Zend Framework
    Réponses: 3
    Dernier message: 16/02/2010, 18h38
  2. Réponses: 9
    Dernier message: 13/12/2009, 13h28
  3. [AJAX] Tableau dynamique [AJAX/MySql]
    Par benoit63 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/10/2008, 19h52
  4. Tableau dynamique (Ajax)
    Par sliderman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/05/2008, 22h16
  5. [Rico] Ajax - Open rico création de tableau dynamique
    Par Naruto69 dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 08/04/2008, 17h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo