Newsgroup: it.comp.lang.javascript
Titolo: parse XML, navigazione del DOM, AJAX

Salve,
sto affrontando un progetto (per me) abbastanza ambizioso, conoscendo
abbastanza poco di Javascript. Ve lo riassumo brevemente.
In una pagina ho due div, uno a sinistra con un menu ad albero, e uno a
destra dove visualizzo i form di inserimento.
Il tutto con AJAX: JS lato client, PHP5 lato server, XML+HTML in mezzo.
Il menu di sinistra e` formato, al primo livello, da una lista di date, in
ordine. Tramite un tasto, nella parte di destra si puo` aggiungere una
news ad una certa data, e il menu di sinistra dovrebbe aggiornarsi con
l'elemento nella data indicata se la data c'e` gia`, oppure aggiungere la
data come primo livello, con la news al suo interno.
Contemporaneamente nella parte destra dovrebbe apparire un messaggio del
tipo "news inserita".
Ho pensato di passare il form via xmlHttpRequest a PHP, che mi restituisce
un XML tipo questo:
<?xml...?>
<root>
 <dates>
  <date value="20061212" />
 </dates>
 <response type="ok">
  News inserita
 </response>
</root>
In JS devo fare il parsing dell'XML, ed estrarre <dates> e <response>.
Il secondo lo piazzo nell'innerHTML del div di destra, mentre il primo
devo ri-parsarlo e prendere ogni data, controllare se nell'HTML c'e` gia`
(e` una serie di <ul>+<li>, naturalmente) ed eventualmente inserirla al
posto giusto. La lista e` gia` ordinata per data, e gli id sono "date al
contrario" ("date_20061212", "date_20061124", ecc.)
Ho trovato il modo di prendere dates e response (con getElementsByTagName)
dall'XML, ma non mi e` molto chiaro come prendere il subset "dates" e
passare uno a uno i vari "date", ma solo li` dentro (potrei avere un
<date> dentro <response> e non voglio prenderlo, mentre
getElementsByTagName me lo trova.
Lo stesso problema ce l'ho a livello HTML per ciclare sui vari <li>, ma
solo alla radice dell'albero, per trovare le date presenti. E cosa usare
per infilare un pezzo di HTML prima di un certo tag nel DOM.
Non voglio la pappa pronta, perche` preferisco capire come funziona
piuttosto che averlo funzionante e basta, visto che dovro` rifare cose
simili anche in altri siti.
Cerco quindi una guida abbastanza chiara sul parsing degli XML via JS, o
un toolkit leggero (max 15-30 Kb) che me lo faccia.
Nel frattempo ne ho scaricati una decina (da Prototype a MochiKit) e me li
guardo, ma se qualcuno mi indirizza verso uno in particolare che faccia
quello che mi serve e bene, riparmio un po' di tempo.
Grazie.
Bye.

 passare uno a uno i vari "date", 
una volta preso con getElementsByTagName l'intero "nodo" puoi ciclare i
"sottonodi" con childNodes e nextsibling:
 
http://developer.mozilla.org/en/docs/DOM:element.nextSibling
oppure ciclare direttamente la collection getElementsByTagName("date")
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.

 oppure ciclare direttamente la collection getElementsByTagName("date")
Grazie per il riferimento, me lo sto leggendo (in parallelo a
"Professional AJAX" e qualche altro sito).
A dire il vero speravo ci fosse qualcosa tipo
foreach (xml.root.dates as procdate) {
  data = procdate.value
  ...
}
ma forse facendolo a mano diventa piu` lungo ma comunque gestibile.
Ora devo studiarmi anche come infilare un <li> in mezzo a una lista invece
di appenderlo alla fine... :)
Grazie ancora.
Bye.

 foreach (xml.root.dates as procdate) {
c'è il for...in ma con ie4 non va e non ricordo, forse non va neanche con
ie 5.0:
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Object_Manipulation_Statements
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 per infilare un pezzo di HTML prima di un certo tag nel DOM.
le DOM API, in particolar modo il metodo insertBefore.
Ti consiglio una lettura alle reference:
#DOM w3c
http://www.w3.org/DOM/
#DOM Gecko
http://www.mozilla.org/docs/dom/domref/
#DOM IE
http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp
-- 
~ "La fantasia è come la marmellata,
bisogna spalmarla su un solido pezzo di pane."
(Gore Vidal)

 }
Questo lo potresti fare con E4X (ECMAScript for XML):
http://en.wikipedia.org/wiki/E4X
Ma attualmente è supportato unicamente da Gecko, quindi vedi tu.
-- 
~ "Lo  dice il  buon senso, ma il buon senso non è uno  standard".
(Jeffrey Zeldman)

 
http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp
E grazie anche per i link. Il secondo lo sto leggendo. Il primo ho aperto
la pagina (era linkata dal secondo) e ce l'ho in lista.
Il terzo mi fa un po' paura... ;)
Bye.

 Il terzo mi fa un po' paura... ;)
Eheh. Ma ti è indispensabile se ti serve la compatibilità con IE.
-- 
~ "L'arte non riproduce cio' che e' visibile,ma rende visibile cio' che non
sempre lo e'"
(Paul Klee)

 
dai un'occhiata a jquery
http://jquery.com/

 essere più precisi, un subset).
OK, ho intrapreso questa strada, ed effettivamente ho molto meno lavoro da
fare sul controller (genero solo array di array in PHP, poi ho trovato una
classe in PEAR che me li converte automaticamente in JSON) e il traffico
sulla linea e` anche molto ridotto.
Tra l'altro avendo una struttura del genere ho spezzato il controller in
tre: una parte genera i dati, le altre, una li trasforma in JSON per il
client e l'altra in HTML da infilare nel template della pagina. Molto
comodo. L'unica "rogna" e` che la trasformazione in HTML e` duplicata tra
PHP e JS, ma vedro` di tenere al minimo le sovrapposizioni.
Ho visto anche che in PHP 5.2, JSON e` stato incorporato nell'engine, ma
per ora sui server ho solo il 5.1... :/
Lato client sto usando questa:
http://www.json.org/json.js
per decodificare tutto.
Ci sono scelte migliori o ho avuto culo e ho trovato il meglio possibile?
Grazie,
bye.

 Ci sono scelte migliori o ho avuto culo e ho trovato il meglio possibile?
Non saprei, io ho sempre percorso una strada parallela, sviluppando per
conto mio un "serializzatore" di oggetti javascript; poi ho visto che
successivamente hanno dato il nome "JSON" a questa "pratica" (se la vogliamo
chiamare così).
Per me, rimane semplicemente la trasformazione di un oggetto js nella sua
forma stringa (e viceversa); tra l'altro io non considero alcun "subset"
(includo anche elementi come Date, per intenderci).
-- 
~ Confondi il mondo, sorridi tutti i lunedì!

 vogliamo chiamare così).
Purtroppo mi sa che non ho le competenze, ancora, per farmelo da solo.
Ma contando che e` il secondo lavoro che faccio in JS, se continuo ad
avere tempo di studiarlo, conto di arrivarci presto (per necessita` piu`
che per virtu` :)
Bye.

 che per virtu` :)
Eheh. La necessità aguzza l'ingegno, del resto. :)
-- 
~ Always remember you're unique, just like everyone else.

 i dati a JS che poi tramite DOM API crea l'HTML relativo?
Esatto.
Pensavo di generare tutto lato server e passarlo al client cosi`:
{ dateadd : { "20061215" : "<li>....</li>" } }
cioe` passandolo gia` pronto al JS, che deve solo controllare che non ci
sia gia` la data ed eventualmente inserire il codice passato dal server.
E` un po' piu` pesante il trasferimento, ma parliamo comunque di 2-300
byte, che mi evitano magari di scrivere 10-20 Kb di JS in piu` da
trasferire al client prima di visualizzare la pagina, e soprattutto di
manutenere due versioni dello stesso codice.
Tra l'altro, siccome in PHP5 c'e` la stessa gestione del DOM che c'e` in
JS (i comandi sono gli stessi: documentElement, appendChild(), ecc.)
volevo cercare se era possibile serializzare anche quello in PHP e
deserializzarlo lato client, ma mi sa che e` la stessa cosa convertirlo in
HTML/XML e poi riparsarlo.
Bye.

 HTML/XML e poi riparsarlo.
Qua mi sono un po' perso il soggetto della questione, ma può darsi che sia
perché ho troppe ore di sonno arretrate :)
-- 
~ "Le leggi sono come le ragnatele: abbastanza forti per catturare i deboli,
troppo deboli per trattenere i forti."
(Anacarsi lo Scita)

 ganzo :-)
Ohilà, ben riapparso. :)
-- 
~ Se i miei cattivi pensieri non fossero caricati a salve, ogni giorno
sarebbe
una strage.

 il frutto delle mie ultime fatiche in tema di XHTML, XML, XSLT e XUL?
No, su faqintosh è un bel po' che non ci vado.. ci ho fatto un salto giusto
ora che me l'hai detto. :) Vedo che ti è preso bene con XUL; bravo, bravo..
;)
-- 
~ La donna è un male, ma un male necessario.
(Aulo Gellio)