OVH Cloud OVH Cloud

Array d'objets

19 réponses
Avatar
unbewusst.sein
j'ai une extension de Array, par exemple la fonction :
#index(o) qui retourne l'index de l'objet dans l'Array.

ça marche bien avec des string.

par contre avec des objets du dom ça marche pas.

apparemment l'objet Array interne à JavaScript n'est pas étendu avec ma
fonction #index(o) si je fais :

var dts=new Array();
dts=document.getElementsByTagName("dt");

et que je liste les propriétés de dts je ne retrouve pas #index.

donc je change de "tactique" je fais :

var dts=new Array();
var dts_=document.getElementsByTagName("dt");
for(i in dts_){dts[dts.length]=dts_[i];}

donc là, sur dts j'ai bien la méthode #index MAIS quand je prend un
élément de cette Array par ex dts[i], cet élément n'a plus les
propriétés/méthodes associées à cet élément du dom (comme objet).

Ainsi, si je fais :

var i=0;
dts[i].style.display='none';

js/console me dit :
dts[i].style has no properties

je ne pige pas où est mon erreur de raisonnement...
c'est peut-être aussi bien une typo toute bête...

la page d'essai est là :
<http://www.yvon-thoraval.com/XHTML11/one-menu.xhtml>
l'erreur apparaît dès le chargement de la page, ce qui n'empèche pas
vraiment le script de marcher...
en cliquant sur le premier élément "HOME" du menu de droite on actionne
la fonction expand(this) qui pour l'instant ne fait que lister les
propriétés d dts (où on retoruve bien index).



--
Artaban de Médée

10 réponses

1 2
Avatar
unbewusst.sein
Une Bévue wrote:

var dts=new Array();
var dts_=document.getElementsByTagName("dt");
for(i in dts_){dts[dts.length]=dts_[i];}


bon, là j'ai corrigé une erreur :

for(var i=0;i<dts_.length;i++) dts[i]=dts_[i];

donc, ce qu'il me reste à comprendre c'est pourquoi, quand je fais
simplement :

var dts=new Array();
dts=document.getElementsByTagName("dt");

l'Array dts n'a pas les méthodes :
has_key
include
index
deleteAt
dont j'ai entendu Array par :
Array.protoype.has_key=function(o) {...}
etc...


--
Artaban de Médée

Avatar
Olivier Miakinen

donc, ce qu'il me reste à comprendre c'est pourquoi, quand je fais
simplement :

var dts=new Array();
dts=document.getElementsByTagName("dt");

l'Array dts n'a pas les méthodes :
has_key
include
index
deleteAt
dont j'ai entendu Array par :
Array.protoype.has_key=function(o) {...}
etc...


Je vais te proposer un autre exemple.

var dts=new Array();
dts=3;

Comprends-tu alors pourquoi dts n'a plus les méthodes en question ?
(Comment ça, ce n'est pas la même chose ?)

Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


Comprends-tu alors pourquoi dts n'a plus les méthodes en question ?
(Comment ça, ce n'est pas la même chose ?)


ouiais je suis d'accord (le "type" est dynamique), je devrais ajouter
dans mes extensions d'Array un concat(Array)

de manière à pouvoir faire directement :

dts=dts.concat(document.getElementByTagName("dt"));

ainsi la boucle for et le dts_ seraient dans mon concat :

Array.prototype.concat=function(a){(for(var i=0;i<a.length;i++)
this[this.length]=a[i];}

ce qui serait + élégant...

j'essaie ça avant de poster...

bon, c'est OK avec #concat !
--
Artaban de Médée

Avatar
Olivier Miakinen

[...] je devrais ajouter
dans mes extensions d'Array un concat(Array)


Ah oui, bien vu.

j'essaie ça avant de poster...
bon, c'est OK avec #concat !


Bravo !

Avatar
ASM

donc je change de "tactique" je fais :

var dts=new Array();
var dts_=document.getElementsByTagName("dt");
for(i in dts_){dts[dts.length]=dts_[i];}


souviens-toi de l'astuce : vider le body / remplir le body

dts[i] = dts_[i].cloneNode(true);

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
ASM

Je vais te proposer un autre exemple.

var dts=new Array();
dts=3;

Comprends-tu alors pourquoi dts n'a plus les méthodes en question ?
(Comment ça, ce n'est pas la même chose ?)


Non je comprends pas :

var A = [1,2,3];
A[1] = [5,6];
var B = A;
alert(B[1][1]); // ---> 6

Ha ? une collection d'éléments n'est pas un tableau (array) ?

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
unbewusst.sein
ASM wrote:

ouviens-toi de l'astuce : vider le body / remplir le body


oui, mais là c'est juste pour faire un display='block'|'none'...
--
Artaban de Médée

Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


Bravo !


merci bien pour cet encouragement )))

j'ai trouvé encore + simple, sans concat ni même sans mémoriser aucune
Array

le but :

quand on clique sur un "dt" (ce qui me donne un this) je veux passer le
"dd" juste après en display='block' et tous les autre en 'none'.

comme je ne sait pas, en JS, manipuler en dom par XPath, j'ai fait ça :

function expand(o){
var cn=O.parentNode.childNodes;
var foundúlse;
for(var i=0;i<cn.length;i++){
if(cn[i]===o)found=true;
if(cn[i).nodeName==="dd"){
if(found){foundúlse;cn[i].style.display='block';}
else cn[i].style.display='none';
}
}
}

le gros intérêt est que je n'ai pas besoin de gérer des id sur les
différents noeuds, enfin j'en ai juste besoin d'un pour initialiser à
'none tous les "dd".
--
Artaban de Médée

Avatar
Olivier Miakinen

Comprends-tu alors pourquoi dts n'a plus les méthodes en question ?
(Comment ça, ce n'est pas la même chose ?)


Non je comprends pas :

var A = [1,2,3];
A[1] = [5,6];
var B = A;
alert(B[1][1]); // ---> 6


Dans ton exemple, tu n'écrases pas la variable de départ A, initialement
affectée à un Array, par autre chose, Array ou pas.

Ha ? une collection d'éléments n'est pas un tableau (array) ?


Pas forcément. Rien ne t'empêche de définir un objet qui se comporte
comme un Array, et qui ait les mêmes méthodes qu'un Array, mais qui
ne soit pas dérivé de l'objet Array. Il semble que ce soit le cas
pour les tableaux d'éléments du DOM.


Avatar
ASM
Olivier Miakinen <om+ wrote:

Bravo !


merci bien pour cet encouragement )))

j'ai trouvé encore + simple, sans concat ni même sans mémoriser aucune
Array

le but :

quand on clique sur un "dt" (ce qui me donne un this) je veux passer le
"dd" juste après en display='block' et tous les autre en 'none'.

comme je ne sait pas, en JS, manipuler en dom par XPath, j'ai fait ça :

function expand(o){
var cn=O.parentNode.childNodes;


var cn = o.parentNode.childNodes;

var foundúlse;
for(var i=0;i<cn.length;i++){
if(cn[i]===o)found=true;
if(cn[i).nodeName==="dd"){
if(found){foundúlse;cn[i].style.display='block';}
else cn[i].style.display='none';
}
}
}


ce truc fait vraiment ce que tu voulais ?
à mon idée ça display le 1er DD et dé-display les autres si plusieurs

function expand(o) {
var dds = o.parentNode.getElementsByTagName('DD');
for(var i=0; i<dds.length; i++)
{
if(i==0) dds[i].style.display = 'none';
else dds[i].style.display = 'block';
}
}

le gros intérêt est que je n'ai pas besoin de gérer des id sur les
différents noeuds, enfin j'en ai juste besoin d'un pour initialiser à
'none tous les "dd".



Heu, je suppose ton html de la forme :

dl
dt /dt
dd /dd
/dl

dans chaque DT
this.parentNode.getElementsByTagName('DD')[0]
attrape tt de suite le DD suivant le DT

et si c'est pour gérer d'un coup tous les dd de la page
dds = document.getElementsByTagName('dd');

et si c'est seulement les DD du div d'id = 'truc'
dds = document.getElementsById('truc').getElementsByTagName('dd');



function switcherTout(divId) {
dds = document.getElementsById(divId).getElementsByTagName('dd');
for(var i=0; i<dds.length; i++) switcher(dds[i]);
}

function switcher(monDD) {
monDD = monDD.parentNode.getElementsByTagName('DD')[0].style;
monDD.display = monDD.display==''? 'none' : '';
}

<dl>
<dt><a href="#" onclick="switcher(this);return false;">
show/hide
</a>
</dt>
<dd>test</dd>
</dl>


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


1 2