Newsgroup: it.comp.lang.javascript
Titolo: [?] NodeValue, .text e Gecko

Ma porc....
Lo ho sempre usato con IE, mò scopro che non è standard.
Semplicissimo xml:
<Response><Ok><![CDATA[corretto]]></Ok></Response>
E funzione che elenca i valori dei nodi:
 function CiclaNodi(N) {
  for(var x=0;x<N.length;x++) {
   alert(N[x].nodeName+"="+N[x].nodeValue);
   if(N[x].nodeType==1&&N[x].childNodes.length>0)
    CiclaNodi(N[x].childNodes); //ricorsività
  } //ciclo tra i nodi	
Sopra, con nodeValue su "Ok" mi restituisce null ("corretto" me lo
restituisce sul nodo "anonimo" #cdata-section).
Con IE ho sempre usato .text e funziona correttamente. Facendo delle
ulteriori prove mi sono accorto che neanche per IE è il massimo perché,
nell'esempio sopra, .text restituisce "corretto" sia per il nodo "Ok" che
per il nodo "Response".
Ma allora: come c@"!£$" si legge "corretto"?
So già che è una cazzata, ma non lo trovo manco scannato, sono 2 ore che
leggo documentazione su mozilla...
Grazie
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 Ma allora: come c@"!£$" si legge "corretto"?
Scusa, hai fatto anche la funzioncina che ti itera tutto, e non sei
risalito alla struttura?
Presupponendo "xmldoc" come il documento che contiene il tuo xml:
alert(xmldoc.documentElement.firstChild.firstChild.nodeValue);
-- 
ZER0
~ .. six thousand and forty three days, nine hours, nine minutes, five seconds.
That is when the world ended.

 alert(xmldoc.documentElement.firstChild.firstChild.nodeValue);
Ok, ma per leggere il contenuto di un nodo?
Se devo leggere il contenuto del nodo "<Ok>" devo quindi recuperare il
riferimento e poi fare un firstChild.nodeValue?
Però firstChild.nodeValue per "Response" mi restituirebbe anch'esso
"corretto"...
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 "corretto"...
"Ma che cavolo stai dicendo Willis.."
-- 
ZER0
~ .. six thousand and forty three days, nine hours, fifteen minutes, fifty five seconds.


 "Ma che cavolo stai dicendo Willis.."
<Response><Ok><![CDATA[corretto]]></Ok></Response>
Response => firstChild => Ok => nodeValue => null (immagino)...
Ok => firstChild => anonimo => nodeValue => corretto
Mi sembra un po' arzigogolata la cosa, vabbè provvedo.
grazie
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

 Mi sembra un po' arzigogolata la cosa, 
Nono, è correttissima e lineare. Mozilla fa così anche in HTML -
giustamente -.
E' IE che, tanto per cambiare, fai i comodacci suoi.
Basta capire che esistono anche i nodi di tipo diverso, oltre agli element
(NODE_TEXT, NODE_CDATA_SECTION - come nel tuo caso -, etc.. ), e ti si
paleserà ogni cosa daventi agli occhi :)
-- 
ZER0
~ .. six thousand and forty three days, nine hours, forty six minutes, six seconds.


 E' IE che, tanto per cambiare, fai i comodacci suoi.
Ho modificato la function (in realtà erano 2, quella che ho postato prima
ciclava i nodi, questa restituisce direttamente il valore del nodo):
 function GetNodeText(N,s) {
  var ris=null;
  for(var x=0;x<N.length;x++) {
   if(N[x].nodeName.toUpperCase()==s.toUpperCase())
    ris=(N[x].firstChild?N[x].firstChild.nodeValue:"");
   else if(N[x].nodeType==1&&N[x].childNodes.length>0) 
    ris=GetNodeText(N[x].childNodes,s);
   } //ciclo tra i nodi
  return ris;	 
 } //GetNode
Vedi controindicazioni? Ho testato con ie-moz-opera8-netscape7.1 e funziona
correttamente:
 - nodo trovato ma non ha firstChild (es. <ok/>) => ""
 - nodo non trovato => null
 - nodo trovato con firstChild => firstChild.nodeValue
Ho letto di usare data perché da è più corretto per nodi testuali, ma la
nodeValue mi sembra un'estensione (più precisamente, data mi sembra un
sottoinsieme di nodeValue, da quel che leggo). Corretto? O dovrei usare
data analizzando prima il nodeType del firstChild?
Domande banali ma determinanti, mi sa che se sbaglio una virgola in questa
fase poi saranno c"£$i acidi!
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 data analizzando prima il nodeType del firstChild?
Dipende da quello che vuoi ottenere (che non ho ancora ben capito).
-- 
ZER0
~ .. six thousand and forty three days, ten hours, eleven minutes, seven seconds.


 Veramente mi pareva di ricordare l'esatto contrario.. dove l'hai letto?
Cercato in giro e ho trovato questo fatto apposta per textnode; uso
comunque sempre nodeValue


 comunque sempre nodeValue
Io invece nelle reference lessi il contrario. Data č generico, nodeValue č
per recuperare del testo. Nei nodi di testo, ovviamente, coincide.
-- 
ZER0
~ .. six thousand and forty three days, ten hours, forty one minutes, forty six seconds.


 per recuperare del testo. Nei nodi di testo, ovviamente, coincide.
Ci credo, ci credo, io lo ho letto tra i 100.000 messaggi che mi sono
passato oggi per risolvere questo dubbio (che alla fin fine mi hai risolto
te...ma a che serve google, dico io? :-))
Grazie


 Grazie
De nada
-- 
ZER0
~ .. six thousand and forty three days, ten hours, fifty eight minutes, twenty seven seconds.


 tsk, adulatore :P 
:-)
-- 
"Ho smesso di fumare.
 Vivrň una settimana di piů.
 E in quella settimana pioverŕ a dirotto"
									    W.A.

 Sì, è vero...ma sarebbe anche comodo.
Secondo me è solo questione di entrare nella giusta mentalità e nella
filosofia dell'XML.
Più avanti apprezzerai tutta la flessibilità che una struttura del genere
ha da offrirti.
Il tuo, nello schema generale del linguaggio XML, è un caso limite.
Che poi sia il caso che tu utilizzi più spesso via XmlHttpRequest, è un
conto. Ma già guarda in XHTML come scrivi il codice, e vedrai come la
struttura è completamente diversa.
A quel punto ti basta realizzare un parser che ti faciliti la lettura delle
tue risposte XmlHttpRequest; non hai da inveire contro le DOM API, o
reinventartele modello Microsoft :)
-- 
ZER0
~ .. six thousand and forty three days, eleven hours, eleven minutes, thirty eight seconds.
