In rete: http://www.elegio.it/javascript/aaa-leggimi-prego.html

27 gennaio 2010

Ho acquistato il libro di uno sviluppatore Microsoft che pero' si preoccupa 
di avere compatibilita' tra Internet Explorer 8 e Firefox.... BRAVO!!!

"Microsoft JavaScript Passo per Passo" di Steve Suehring
ISBN 9788861141483 ( Maggio 2008 Mondadori Informatica )

Ho "italianizzato" i suoi esempi perche' se le function e le variabili
arbitrarie hanno nomi italiani e' piu' facile distinguere tra le
function OBBLIGATORIE e quelle personali.

Il problema che mi sta molto a cuore e' come leggere un file XML
usando Javascript in un file HTML ( o XHTML )

Sapendolo fare potrei assegnare dati e parametri di input ad un qualsiasi
programma Javascript, contenuto in una pagina HTML, che potrebbe usare 
quei dati per effettuare i calcoli che mi interessano...
Dunque in questa ottica il file HTML fungerebbe da eseguibile
mentre il file XML conterrebbe i dati da far processare all'eseguibile... 

INIZIALMENTE PERO' HO AVUTO DEI PROBLEMI DI COMPATIBILITA' TRA
I VARI BROWSER. ORA... FORSE HO CAPITO E VOGLIO SPIEGARE LA
MIA INTERPRETAZIONE DEI PROBLEMI CHE HO INCONTRATO....

Alla data odierna 2010.0127 la lettura di un file XML non mi funziona
usando Safari 4 e Chrome 4. Tutto va liscio usando Firefox 3.5 ed Opera 10 ma
adottando il metodo suggerito da Steve Suehring ossia facendo chiamate di
function diverse rispetto a quelle necessarie quando si usa Internet Explorer 8.
Con IE8 le pagine funzionano anche usando l'XHTML ma... solo se sono
messe in rete, altrimenti interviene il blocco di protezione che
non riesco a disattivare ( un grazie a chi mi spiegasse come fare ).

Comunque, in sostanza, la lettura di un file XML funziona con
IE8, Firefox ed Opera... ( un grazie a chi lo ha reso possibile !)

Ma per un po' ho incontrato una grossa difficolta' avendo voluto
aggiungere un tocco personale all'esempio.
Dato che la lettura del file XML avviene in modo asincrono bisogna
scrivere function che entrino in azione solo dopo che la lettura è completata.
E' un po' come quando si inseriscono script in una pagina HTML.
La prima function chiamata in modo automatico deve essere chiamata
quando tutta la pagina e' stata caricata: bisogna dunque chiamare
la prima function quando scatta window.onload altrimenti sono guai.

Nel caso di lettura asincrona di un file XML bisogna che tutte le operazioni
javascript avvengano a cascata quando tutto il file e' stato letto.

Allora io ho aggiunto una function di nome utilizza() e li' ho cercato
di leggere una cella della tabella che avevo creato dinamicamente.
Ma usando Firefox invece di IE8 l'ID della cella non puntava a nulla !

PANICO ! 

Piano piano ho pero' capito questo:
Supponiamo di scrivere quesa marca <mia> che contiene un po' di marche <boh>.
Il frammendo di documento XML sia il seguente:

<mia>: <boh>1</boh>, <boh>2</boh>, <boh>3</boh>, </mia>

Ora supponiamo di voler sapere quanti nodi sono contenuti nella
marca <mia> ossia supponiamo di chiamare listamarche[0].childNodes.length
dove in listamarche ci sta la lista di tutte le marche di tagname "mia".
Ingenuamente ho creduto che fossero tre ( le tre marche <boh> ) ma la risposta
giusta e' invece sei perche' il testo presente tra due marche viene
considerato un tipo speciale di marca... priva di delimitatori.
Ora in Windows l'andata a capo si fa con una coppia di caratteri ossia
&#13; ed &#10; ( CR e LF ) mentre in Unix basta il solo &#13;
per cui siccome Firefox ragiona in Unix, se scrivo:

<mia>
<boh>1</boh>
<boh>2</boh>
<boh>3</boh>
</mia>

per IE8 non ci sono caratteri di testo tra le marche <boh> e dunque la
listamarche[0].childNodes.length mi da' 3 mentre per Firefox tra le 
marche <boh> ci sono caratteri ( il carattere &#10; ) per cui 
listamarche[0].childNodes.length mi dà 7 ! Pertanto 
se cerco di accedere alla prima marca la cui id e' numerata 
col numero della posizione dei nodi, per IE8 devo cercare l'id 0 ma 
con Firefox devo cercare l'id 1 ( ossia la successiva perche' nel 
file XML c'era una andata a capo )

Verificare questa diagnosi visitando la pagina:

test.html

che se acceduta con IE8 ( standard Windows) si comporta in modo diverso 
da come si comporta acceduta da Firefox o da Opera ( standard Unix ).

Pur avendo capito il problema e avendolo superato, lascio qui in
corsivo il mio grido di dolore di quando mi sembrava di stare 
nel guano:

Ma il guaio piu' grosso che ho individuato e' questo:

Creo una tabella, ci metto i dati che estraggo da un file XML e fin qui va tutto bene....
Pero' io metto un identificatore ad alcune marche <th> e terminata la creazione
della tabella vado a rileggere queste marche per verificare che questa
operazione sia possibile ( come deve essere ).
In IE8 va tutto bene. Uso la document.getElementById passandogli una id e 
lui mi fa esattamente quello che voglio....

Usando invece Firefox ed Opera il programma mi restituisce null ossia non trova
la marca che vorrei recuperare ed ovviamente neppure il suo contenuto !
Questo e' un fatto GRAVISSIMO ovviamente !

Come aggirare questa difficolta'  ????

Sono anni che il malfunzionamento e l'incompatibilita' tra i browser stanno
sabotando l'utilizzo dell'XML come fonte di dati in pagine HTML!
Non sarebbe ora di finirla e di fare cose non bacate ????


Naturalmente qui non c'era un baco ma il venire a galla della differenza tra un
documento di testo scritto in stile Unix e uno scritto in stile Windows.
Ecco i file sperimentati che invito ad aprire e a guardare per capire come il sorgente HTML va fatto...
Da ultimo mi permetto di fare una critica al modo di fare di un cittadino USA
( mi comporto da Guido Bertolaso ad Haiti
ma spero di non far piangere la Clinton e di non essere punito da Berlusconi )

Per motivi didattici avrei tenuto separata la dimostrazione di come si
fa a creare una tabella da come si fa per leggere un file XML aggirando le
differenze tra Internet Explorer ed il resto del mondo.
Per la verita' anche Steve Suehring tiene le due cose separate ma io
avrei trattato con molta maggiore enfasi l'aspetto della creazione dinamica di
marche HTML usando le function del DOM...

Visitare questa pagina dove la lettura di file XML non c'entra:

costruisco.html

ed applicare quanto appreso, guardando il sorgente HTML, in
mille ed una occasione...