Newsgroup: it.comp.lang.javascript
Titolo: Costruire albero su richiesta...

Ciao, son di nuovo qui :-)
Alur...
Sto cercando di realizzare un menu ad albero "a richiesta". Ovvero...
Sul server ho un elenco di elementi, ciascuno con un proprio codice
identificativo. Ognuno di questi elementi ha anche il codice di un
padre, ovvero di un'altro elemento dell'elenco; insomma, il classico
albero gerarchico.
Ora, visto che
1) l'albero in questione puo' contenere qualche centinaio di foglie
2) Magari chi apre la pagina apre un ramo, poi un'altro, poi modifica
una foglia, e poi basta.
pensavo che sarebbe interessante costruire l'albero lato client man
mano che l'utente apre i rami, in modo da ridurre al minimo il numero
di elementi della pagina (e distruggendo gli elementi quando l'utente
chiude un ramo).
E' piu' una curiosita' che una effettiva necessita'...diciamo che mi
interessa per imparare qualcosa di nuovo.
E qui, la mia domanda: cosa posso usare, in javascript, per costruire
un'elenco di elementi facilmente ricercabili/filtrabili?
Ad esempio...mettiamo che il primo ramo del mio albero abbia ID 1.
L'utente clicca per aprire il ramo, ed io devo cercare tutti gli
elementi con IDPadre=1.
Idee?
Grazie :-)

 elementi con IDPadre=1.
La prima, e piu` banale, e` di codificare gli id:
- 0
  - 00
  - 01
  - 02
  - 03
    - 030
    - 031
  - 04
- 1
  - 10
...
(naturalmente dipende da quanti figli ti aspetti). Rigido e non proprio
bellissimo. Al limite modificabile con la versione 0-3-1 al posto di 031,
che e` piu` estensibile.
In caso contrario non puoi usare gli id perche` devono essere univoci,
quindi dovresti usare un attributo non HTML, tipo "parent" da attaccare ai
nodi (con il semplice <li parent="0" nodeid="3"> o col DOM)
Altrimenti potresti arrangiarti passando self come parametro sull'onClick
e abbandonare gli id, ma non so perche` non mi ispira moltissimo. :)
Bye.

Alessandro Pellizzari ha scritto:

[cut]
Ho capito poco della tua risposta e mi rendo conto che anche la mia
domanda non era chiarissima.
Allora...
Lato client, ovviamente uso degli ID numerati ed univoci, l'ho gia
fatto decine di volte senza problemi: si stabilisce una radice generica
(tipo "leaf") e si aggiunge l'ID numerico dell'elemento. In pratica
quando costruisco un elemento che aveva ID = 29, l'elemento html avra'
id="leaf29".
Il problema, pero', era da tutta un'altra parte...ma mi sono spiegato
malissimo.
Sul server ho l'elenco degli elementi, li estraggo da una tabella. Con
del codice lato server (ASP nel mio caso, ma anche PHP o JS) costruisco
il primo livello dell'albero, e fin qui niente di che.
Pero' poi devo inserire ALL'INTERNO della pagina un qualcosa che poi
javascript sul client sia in grado di processare.
Ad esempio, potrei passare una stringa costruita con il fomato
ID|NOME|IDPADRE:
3|CAT11|1|4|CAT12|1|5|CAT13|1|6|CAT21|2|6|CAT111|3|
Ma poi devo convertirla in una qualche oggetto in memoria indicizzato e
ricercabile con chiave, in modo che se l'utente apre il nodo con ID=1
io dico all'oggetto filtro="IDPadre=1" ed ottengo gli elementi
CAT11
CAT12
CAT13
Stavolta credo di essermi spiegato meglio...tanto per fare un parallelo
con chi conosce VB, mi serve qualcosa lato client simile alle
Collection di VB :-)

 il primo livello dell'albero, e fin qui niente di che.
Il DOM costruisce comunque, ed in modo indipendente, una struttura ad
albero rovesciato. Se all'interno du un document inserisci tre div non
nidificati, avrai un punto con tre rami, se poi all'interno di uno di
questi div, inserisci altri div (o altri elementi) avrai uno sviluppo
verso il basso dell'albero. Seguendo lo schema del DOM ti troverai con
una struttura ad albero costruita all'interno del document indipendente
dal parametro id.
Per identificare la posizione dei vari elementi usi le proprietà e i
metodi disponibili quali:
parentNode verso l'alto
childNodes verso il basso
previousSibling, nextSibling allo stesso livello