Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1237 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [JS] Comment récupérer tous les indices/membres d'un tablea/objet

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JS] Comment récupérer tous les indices/membres d'un tablea/objet

n°1405208
Yoyo@
Posté le 12-07-2006 à 09:23:52  profilanswer
 

Salut,
 
J'essaie d'appréhender un peu mieux le Javascript, car ça me parait un peu la jungle pour le moment.
 
Je me pose une question:
 
Comment faire pour avoir les noms de tous les membres/indices d'un objet/tableau en Javascript.
 
J'ai tenté le code suivant:
 

Code :
  1. var buf = 'myObj indices:\n';
  2. for (i in myObj){
  3. buf += "+ " + i + "#" + (typeof myObj[i]) + "\n";
  4. }
  5. alert(buf);


 
Mais je me rend compte que ça marche de manière assez aléatoire, par exemple, avec document.images:
 
 

Code :
  1. var buf = 'document.images:\n';
  2. for (i in document.images){
  3. buf += "+ " + i + "#" + (typeof document.images[i]) + "\n";
  4. }
  5. alert(buf);


 
Par exemple, sous IE6, et en imaginant ue j'ai un seul <img name="myImg"....> dans mon document, il ne me sort que deux membres pour document.images, qui sontdocument.images, qui sont myImg et length...
Et pourtant, je sais que document.images.item existe aussi, et pour preuve, je peux faire un typeof document.images.item, et il me sort "string"....
 
Bre, j'aimerais y voir plus clair...

mood
Publicité
Posté le 12-07-2006 à 09:23:52  profilanswer
 

n°1405235
gatsu35
Blablaté par Harko
Posté le 12-07-2006 à 09:41:55  profilanswer
 

Quelques petites mises au point s'imposent :o
 
document.layers, document.all, document.images, document.anchors et toutes ces autres merdes c'est poubelle.
 
un élément ça n'a plus de name, le name est déprécié depuis longtemps, le name ne sert plus à rien sauf sur les éléments d'un formulaire.
 
pour recuperer un élément de nos jours c'est par un id
 

Code :
  1. <p id="toto"></p>
  2. var monp = document.getElementById("toto" );


ici la variable monp est une référence à l'élément p dans la page
 
maintenant pour récupérer une liste d'images, une liste de lien dans le document, il y a des méthodes propres à chaque objets.
 

Code :
  1. var a = document.getElementsByTagName("a" );


là j'ai récupéré un tableau contenant toutes les A de la page
pour le parcourir :  

Code :
  1. for (var i=0; i<a.length; i++) {
  2.   alert(a[i].href);
  3. }

Message cité 1 fois
Message édité par gatsu35 le 12-07-2006 à 09:43:49
n°1405247
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-07-2006 à 09:51:19  profilanswer
 

Waouuh Artung avec

Code :
  1. for ( var in truc)


Si truc est autre chose qu'un tableau ça remonte toute ses "propriétés", genre si c'est un objet ça va remonter ses attributs, méthodes etc...
C'est super pratique quand on le sait, mais ça amène aussi des confusions.
A noter aussi que le for ... in remonte l'indice du tableau ( et pas l'element correspondant)
 
Alors dans l'exemple de Gatsu, ça fait pas du tout ce qu'il faut vu que a n'est pas un tableau mais un objet DomNodeCollection :o
Avec le code suivant:

Code :
  1. var a = document.getElementsByTagName('a');
  2.     for ( i in a ){
  3.       alert(i);
  4.     }


On obtient des trucs genre:


0 // le premier indice de mon tableau
...
X // le dernier indice de mon tableau
length //la longueur du-dit tableau
item // une fonction DomNodeCollection
namedItem //pareil

Message cité 1 fois
Message édité par anapajari le 12-07-2006 à 09:51:56
n°1405252
gatsu35
Blablaté par Harko
Posté le 12-07-2006 à 09:52:52  profilanswer
 

+1 pour les précisions

n°1405256
Yoyo@
Posté le 12-07-2006 à 09:55:29  profilanswer
 

gatsu35 a écrit :

Quelques petites mises au point s'imposent :o
 
document.layers, document.all, document.images, document.anchors et toutes ces autres merdes c'est poubelle.
 
un élément ça n'a plus de name, le name est déprécié depuis longtemps, le name ne sert plus à rien sauf sur les éléments d'un formulaire.
 
pour recuperer un élément de nos jours c'est par un id
 

Code :
  1. <p id="toto"></p>
  2. var monp = document.getElementById("toto" );


ici la variable monp est une référence à l'élément p dans la page
 
maintenant pour récupérer une liste d'images, une liste de lien dans le document, il y a des méthodes propres à chaque objets.
 

Code :
  1. var a = document.getElementsByTagName("a" );


là j'ai récupéré un tableau contenant toutes les A de la page
pour le parcourir :  

Code :
  1. for (var i=0; i<a.length; i++) {
  2.   alert(a[i].href);
  3. }



 
Ouh là, zut, j'ai orienté la discussion sur un autre sujet... Je ne cherchais en aucun à demander comment réupérer une référence sur un élément de mon document, mais vraiment une question plus générale, à savoir comment avoir la liste des attriuts des objets/tableaux (j'ai l'impression que c'est plus ou moins la même chose) sous JS... Et j'ai pris document.images comme exemple....
 
Bon, alors, je vais prendre un autre exemple: var range = document.selection.CreateRange()
 
Ca me retourne un objet. Comment faire pour avoir tous les attributs/fonctions de cet objet....
 
Si je fais un:
 

Code :
  1. for (i in document.selection.createRange()){
  2.   buf += i + "\n";
  3. }
  4. alert(buf);


 
Je n'obtiens pas, dans ma liste, la fonction move(), alors que je sais qu'elle existe sur cet objet...
 
Ce n'est vraiment qu'un exemple, mais c'est pour illustrer ma question.
 
Je cherche à comprendre comment ça marche, car ça ne me parait pas très très clair (et j'ai l'impression que les objets ne sont que plus ou moins des tableaux ou vice versa...)
 
merci quand même pour les précisions plus haut.

n°1405260
Yoyo@
Posté le 12-07-2006 à 09:59:11  profilanswer
 

anapajari a écrit :

Waouuh Artung avec

Code :
  1. for ( var in truc)


Si truc est autre chose qu'un tableau ça remonte toute ses "propriétés", genre si c'est un objet ça va remonter ses attributs, méthodes etc...
C'est super pratique quand on le sait, mais ça amène aussi des confusions.


 
C'est exactement ce que je cherche (car ça me permettrait de voir plus facilement ce que support chaque navigateur, chui un peu paumé dans les compatibilités, etc...)
 
Mais justement, cette façon de lister les membres d'un objet (que ce soit attributs, méthodes) ne me donne pas l'impression d'être fiable.
 
En fait, mon idée, c'était que le for...in liste tous les indices d'un tableau, et queles objects JS sont des tableaux ou viced versa, donc, j'avais eu cette idée, sans doute un peu naïve (vu que ça ne semble pas fiable) et donc, c'est pour ça que je viens demander des précisions ici.


Message édité par Yoyo@ le 12-07-2006 à 09:59:51
n°1405273
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-07-2006 à 10:07:47  profilanswer
 

En gros en js tout object un est tableau...  
Le for ... in ça marche très bien mais tu as l'air de l'utiliser bizarrement :o
 
S'koi ça:

Code :
  1. document.selection.createRange()


Je dis pas que je suis un star en js, mais j'ai jamais vu ou eu à m'en servir ...
Donc je pense pas que ça soit terrible :o

n°1405283
Yoyo@
Posté le 12-07-2006 à 10:16:24  profilanswer
 

anapajari a écrit :

En gros en js tout object un est tableau...  
Le for ... in ça marche très bien mais tu as l'air de l'utiliser bizarrement :o
 
S'koi ça:

Code :
  1. document.selection.createRange()


Je dis pas que je suis un star en js, mais j'ai jamais vu ou eu à m'en servir ...
Donc je pense pas que ça soit terrible :o


 
Lol, bah ce document.selection.createRange() retourne, sous IE et Opera, ce qui est actuellement sélectionné dans la page (en bleu, avec la souris).
J'ai donné cet exemple, car c'est ce que j'avais sous la main, et qui m'a fait remarqué que ça marchait pas très bien...
 
Mais je te dis, tu peux essayer avec document.images...
 
Essaie le code suivant sous IE, par exemple dans une page sans <img>
 

Code :
  1. buf="";
  2. for (i in document.images){
  3. buf += i + "\n";
  4. }
  5. alert(buf);
  6. alert(typeof document.images.item);


 
Tu verras que IE ne va te donner qu'un seul élément pour document.imagesqui est length
 
Mais par ailleurs, lors du typeof, IE montre que l'attribut item existe, puisque IE retourne "string" alors qu'il aurait retourné "undefined" si ce dernier n'existait pas...  
 
Tu vois ce que je veux dire?
 
Il y a donc un problème dans la théorie...

n°1405301
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-07-2006 à 10:39:10  profilanswer
 

Mais c'est quoi ces examples moldaves du XIVeme siècle :o
Bon pour selection, ok maintenant je sais à quoi ça sert. Je reste quand même sceptique sur le fait que document.selection.createRange()  soit un objet ( c'est sur lui que tu faisais ton for ... i).
Quand a tes images, je rejoins ce que disais Gatsu, fait 10 ans qu'on a arrété document.images, ça m'étonne pas que ça marche pas ( encore que je suis sceptique sur ton .item )
 
Prenons un vrai exemple :), genre un objet qu'on a fait nous:

Code :
  1. function Voiture(){
  2.     var nbRoues = 4;
  3.     var nbPlaces = 5;
  4.     this.vitesse = 0;
  5.     function pneuCreve(){
  6.       this.nbRoues = 3;
  7.     }
  8.     this.klaxonne = function(){
  9.       alert('pouet');
  10.     }
  11. }
  12. Voiture.prototype.roule = function (){
  13.    this.vitesse = 90;
  14. }
  15. Voiture.prototype.freine = function(){
  16.     this.vitesse = 0;
  17. }
  18.   window.onload = function(){
  19.     var v = new Voiture();
  20.     for ( var i in v){
  21.       alert(i + ' -- '+ v[i])
  22.     }
  23.     v.klaxonne();
  24.   }


Et la tu vas me dire oui mais il alerte pas nbRoues, nbPlaces et la fonction pneuCreve... bin c'est normal [:spamafote] ce sont des propriétés/methodes privées de ton objet et tu essayes d'y accèder de l'extérieur.
 
Il n'y a pas vraiment de problème dans la théorie ;)

Citation :

In theory, there is no difference between theory and practice. But, in practice, there is. -- Jan L. A. van de Snepscheut


Message édité par anapajari le 12-07-2006 à 10:39:53
n°1405331
Yoyo@
Posté le 12-07-2006 à 11:11:59  profilanswer
 

Bon, OK, soit... Ca marche très bien avec nos propres objets, avec encapsulation, etc. Mais ce qui m'intéresse, dans le but de débugger les choses, c'est les objets prédéfinis, et là, la gestion semble bizarre....
 
Peux tu essayer de copier le code suivant dans un fichier html et l'ouvrir avec IE:
 

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
  3. <head>
  4.  <script type="text/javascript">
  5.   function jstests(){
  6.    if (typeof document.selection != 'undefined'){
  7.     document.myform.mytext.focus();
  8.     var range = document.selection.createRange();
  9.     alert("Selected Text: " + range.text);
  10.     var buf="range attributes:\n";
  11.     for (var i in range){
  12.      buf += i + " # " + typeof(range[i]) + "\n";
  13.     }
  14.     alert(buf);
  15.     alert(typeof range.move);
  16.    }
  17.   }
  18.  </script>
  19. </head>
  20. <body>
  21.  <a href="nowhere.html" onclick="jstests(); return false;">Test</a>
  22.  <form name="myform">
  23.   <textarea name="mytext">Select some text here...</textarea>
  24.  </form>
  25. </body>
  26. </html>


 
Tu verras que "move" n'est pas listée dans ma liste "range attributes" mais que cependant, cet attribut existe bel et bien (et c'est une fonction dans la réalité), comme le prouve l'alert juste en dessous. Essaie STP et dis moi ce que tu en penses. Ca te permettra en plus de tester la sélection dans le textArea et voir comment ça marche ;)

mood
Publicité
Posté le 12-07-2006 à 11:11:59  profilanswer
 

n°1405369
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-07-2006 à 11:31:05  profilanswer
 

Ce que j'en pense c'est que c'est du propriètaire IE, que ça marche pas et qu'en plus même la doc dans la MSDN est à l'ouest ...
http://msdn.microsoft.com/workshop [...] trange.asp , nous apprends que la members table est vide :o
Donc je suis déjà surpris que ça alert quelque chose :o

n°1405385
Yoyo@
Posté le 12-07-2006 à 11:39:34  profilanswer
 

anapajari a écrit :

Ce que j'en pense c'est que c'est du propriètaire IE, que ça marche pas et qu'en plus même la doc dans la MSDN est à l'ouest ...
http://msdn.microsoft.com/workshop [...] trange.asp , nous apprends que la members table est vide :o
Donc je suis déjà surpris que ça alert quelque chose :o


 
Bon, OK, je tombe àa priori que sur des exemples à "deux balles". Je suis surpris qu'avec le document.images, même si son utilisaion est deprecated, ça ne marche pas correctement non plus. J'en déduis que le JS est tellement haut niveau qu'il y a des exceptions dans tous les sens... (et donc, je ne suis pas avancé pour savoir comment décortiquer mes objets et savoir ce qui est compatible avec tel ou tel navigateur.)
 
Alors, si on en revient à des "objets" un peu moins farfelus, et si on prend le simple cas d'un tableau, considérons l'exemple suivant:
 

Code :
  1. function jstests(){
  2.    var arr = new Array(1,2,3);
  3.    buf = "";
  4.    for (var i in arr){
  5.     buf += i + "\n";
  6.    }
  7.    alert(buf);
  8.    alert(arr.length);
  9.   }


 
Pourquoi l'attribut length n'apparait il pas dans la liste des attributs de mon tableau? Car finalement, on peut appeler length sur mon tableau, donc, ca devrait être un attribut comme un autre?
 
Dernière question, d'ordre plus général... Tu utilises quoi comme site de référence pour JS? Car ca devient rapidement la jungle je trouve....
 
merci :hello:

n°1405428
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-07-2006 à 12:06:48  profilanswer
 

Yoyo@ a écrit :

J'en déduis que le JS est tellement haut niveau qu'il y a des exceptions dans tous les sens...


ça c'est sur :o

Yoyo@ a écrit :

(et donc, je ne suis pas avancé pour savoir comment décortiquer mes objets et savoir ce qui est compatible avec tel ou tel navigateur.)


Tes objets tu peux en faire ce que tu veux, les objets "standards" ne réagissent pas forcément de la même façon.
C'est le cas de ton exemple sur le tableau, je suis sur que le length apparait pas "on purpose"...  
Tout comme plein d'autres méthodes genre push, pop, reverse ...
T'as qu'a te faire une classe Tableau :o
 

Yoyo@ a écrit :

Dernière question, d'ordre plus général... Tu utilises quoi comme site de référence pour JS? Car ca devient rapidement la jungle je trouve....


c'est vrai que c'est la jungle ;)
Mon camp de base:
http://developer.mozilla.org/en/do [...] _Reference => la "Core Reference", tout ce qu'il y a dedans marche partout ( enfin ... )
ensuite pour le dom tu as au même endroit:  
http://developer.mozilla.org/en/do [...] _Reference => je le trouve un peu bordélique, du coup je lui préfère souvent:
http://www.laltruiste.com/document [...] maire.html => l'interface est immonde et c'est lourd mais la doc DOM est bien classé et tout y est
Pour l'OO en js, la seule page correcte que j'ai trouvée :
http://phrogz.net/JS/Classes/OOPinJS.html ( les bases)
http://phrogz.net/JS/Classes/OOPinJS2.html (l'héritage)
http://phrogz.net/JS/Classes/Exten [...] asses.html ( ajout dynamique de méthode/attribut sur une classe)
Ensuite un oeil sur http://www.quirksmode.org/js/ qui contient moults scripts et tutoriaux "bien écrits" ( c'est rare)
voilou  
 

n°1405447
Yoyo@
Posté le 12-07-2006 à 12:18:13  profilanswer
 


 
Merci pour tout ça, j'y jetterai un oeil petit à petit.
 
Pour ce qui est de quirksmode.org, j'ai découvert ce site hier, et honnêtement, je l'ai trouvé vraiment bien. Il n'est bien sûr pas exhausitf, mais propose plein d'exemples creusés, de discussions, etc... Et ils ont des tableaus de références sur les différents supports de telles ou tells fonctionnalités vraiment très bien faits, du genre http://www.quirksmode.org/dom/w3c_core.html
 
Sinon, pour ma part, je consulte www.selfhtml.org qui est pas mal dans son genre, et terme de référence, même si malheureusement, ce site ne semble plus mis à jour pour sa version française ou anglaise...
 
Enfin, pour info, mon principal but avec JS est de créer un éditeur très simplifié permettant de mettre en page (gras, italique, souligné, listes et tableaux).
Je me te tate encore entre un système du genre BBCodes et un système édition en temps réel utilisant du DHTML.
Et avant ça, et pour me décider, il faut que je puisse maîtriser JS un minimum.
 
Ou alors, je vais m'orienter vers un outil tout fait, du genre TinyMCE, mais il reste beaucoup trop complet (et donc lourd) pour moi, et jene pense pas que je puisse en maitriser la source pour l'adapter à mes besoins simples...
 
Merci pour les détails en tout cas.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [JS] Comment récupérer tous les indices/membres d'un tablea/objet

 

Sujets relatifs
Récupérer uniquement la racine du site d'un referer[ACCESS] récupérer une requete sous VB
Pour récupérer l'adresse url actuel[OpenGL] récupérer les pixels (glReadPixels trop lent)
Recupérer une URL a partir d'une autre qui y pointe par redirection?Récupérer valeur de la variable qui incremente
[Javascript/PHP] Récuperer le contenu d'un array et le passer par GETerreur: reference d'objet pas défini à une instance
[Select + onchange] Recupérer la valeur de l'index précédentrecuperer l'id de la page en JS
Plus de sujets relatifs à : [JS] Comment récupérer tous les indices/membres d'un tablea/objet


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR