Newsgroup: it.comp.lang.javascript
Titolo: Accesso a file XML in locale OK su Apache KO

Riprendo un esempio che ho trovato su questo NG per chiederVi un aiuto... e
considerata che la cosa è piuttosto urgente vi espongo il mio problema.
Questa è la mia pagina HTML:
<html>
 <head>
  <title>Estrarre dati da un file Xml con Javascript</title>
  <style type="text/css">
   h1 { color: #800000; font-size: 15px; font-family: Verdana; }
   td { background-color: #FFFFFF; font-size: 12px; font-family: Verdana; }
  </style>
  <script language="javascript" src="codice.js"></script>
 </head>
<body>
<h1 align="center">DataBase</h1>
<div id="Stampa"></div>
<script language="javascript">
//<!--
pippo();
//-->
</script>
</body>
</html>
il file codice.js è questo:
function pippo() {
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
xmlDoc.load("database.xml");
alert("Ecco");
var xpath="//lb:row";
var aResult = xmlDoc.selectNodes(xpath);
var Mostra = "";
for (var i = 0 ; i < aResult.length ; i++)
    {
    Mostra += "<P>"+ aResult[i].getAttribute("rowattr") +"</P>"
    }
Stampa.innerHTML = Mostra;
}
Cosi in locale funziona e anche in remoto.
Se tolgo l'istruzione alert("Ecco"); invece in locale continua a funzionare
ma su un web server (apache) non funziona più.
Il problema sembra essere che quando tenta di eseguire la selectNodes il
load del database.xml non è ancora terminato.
Se ci aggiungo l'alert invece funziona, perché gli da tempo di caricare il
file xml.
Come si puo risolvere la questione? C'è un modo per controllare il
completamente del carimento del file XML?
Ho pensato a fare una cosa di questo tipo:
var flag = true;
while (flag){
try {var aResult = xmlDoc.selectNodes(xpath);}
catch (e) {flag="true"};
}
Ma non riesco ad impostarlo un ciclo di questo tipo.
Un aiutino?
--Gabriele

Due metodi:
il primo è di far sì che lo script non prosegua finché il documento non è stato letto:
xmlDoc.async=false
 - NB: da mettere prima di xmlDoc.load
il secondo di attaccargli un evento che parta non appena il documento è caricato:
xmlDoc.onreadystatechange = vaiAvanti;
Cerca sul sito 
msdn.microsoft.com
 e trovi la documentazione completa, inclusivo di note circa la compatibilità con lo standard W3C
Alex.
-- 
___________________________________________________________
a p bertolini
"Se Dio è perfetto, perché ha creato le funzioni discontinue?"
#ICQ: 10681264
(
www.webwarrior.org
)

> xmlDoc.async=false
Adoro questo NG :-)
Grazie,
--Gabriele

> oh bella... ma questo non e` javascript.
Va bene... ma esiste un modo "javascript" per farlo?
Su mozilla avrei utilizzato XMLhttpRequest ... su explorer ho trovato
quest'altra strada...
--Gabriele


Leggo il thread in frettissima e rispondo nella stessa maniera:
se il problema e' il caricamento del documento hai a disposizione 
l'evento onload e, su IE/Jscript, l'evento onreadystatechange (ti 
rimando a msdn per i valori possibili di readystate).

 rimando a msdn per i valori possibili di readystate).
Grazie per l'interessamento ma la soluzione "xmlDoc.async" suggeritami in un
post precedente era quella che meglio si adattava al mio caso specifico.
C'è comunque qualche motivazione per preferire l'evento onreadystatechange,
alla soluzione xmlDoc.async?
Ciao.
--Gabriele

Con xmlDoc.async ti si blocca lo script e quindi eventuali altre operazioni (magari anche non inerenti quell'oggetto) non vengono
eseguite.
Con la gestione ad eventi, eseguirai la porzione di script relativa all'oggetto quando necessario. Nel frattempo puoi fare
dell'altro :-)



Dipende sempre dal tuo caso.
Esempio di quando prediligo la chiamata asincrona:
non si deve aspettare l'esito della chiamata per restituire il controllo 
al "chiamante"; e qui entrano in ballo gli eventi per verificare lo 
stato di caricamento.
La comodita' e' di non subire blocchi al resto dell'interfaccia mentre 
vengono eseguite le chiamate.

 vengono eseguite le chiamate.
Ah OK... allora nel mio caso la async è perfetta infatti è l'ultima cosa che
viene carica nell'interfaccia (che fra l'altro) non è più che una tabella
con un titolo sopra.
Ciao.
--Gabriele

 oh bella... ma questo non e` javascript.
e poi, domanda: ma non si apre una finestra di avviso di utilizzo di 
quel componente activex alla quale uno può dire di no?

 quel componente activex alla quale uno può dire di no?
Con le impostazioni che ho sul browser non mi chiede nulla, ma se aumento il
livello di protezione (si protezione, non ridete :-), è cosi che la chiama
M$) o se personalizzo tale livello, probabilmente si puo' impostare il
browser in modo che ti chieda conferma prima di utilzzare il controllo
ActiveX.
E' un problema su Internet... ma su una Intranet è accettabile...
o no?
Ciao.
--Gabriele

 
se ciò che fai è per una piccola azienda o per te si, se lo fai per una 
grossa azienda il sistemista non accetterà mai di far abbassare la 
sicurezza dei browser sulle macchine da lui amministrate.
E' un problema che mi è capitato più volte in alcuni casi mi era stata 
persino bloccata l'esecuzione di activex intranet, quindi attento.
saluti.


Su una intranet il problema non si pone, in quanto puoi specificare 
quali sono i "siti attendibili" e comunque assegnare livelli di 
protezione differenziati per la intranet (tutto da browser, senza 
affaticare troppo il sistemista).
A parte questo gli ActiveX non sono tutti uguali (firmati e non firmati, 
sicuri e non sicuri) e la chiamata xmlhttp e' possibile con le 
impostazioni predefinite di ie (oltre che sul buon mozillone, senza 
tirare in ballo nulla).
Piuttosto, visto che siamo in argomento, pongo una domanda per 
Balestra/Catarsi: sulle versioni di ie/mac e' possibile fare chiamate 
xmlhttp? E Safari?

 "no" per entrambi, AFAIK (Safari e` basato su una mutazione di Geko).
Proprio per quello chiedevo: quindi mi dici che non e' stato 
implementato. Notizie per il futuro? O meglio un buon link da tenere 
sott'occhio per lo sviluppo su browser mac?

 affaticare troppo il sistemista).
appunto, nelle grosse aziende tutte queste operazione le può eseguire 
solamente il sistemista o comunque l'amministratore delle postazioni 
lavoro che fa sempre mille domande ed è restio a far queste modifiche.

 (ovvero la negazione di uno standard). Prosit.
Che mozilla sia moglio di ie lo deve ammettere ogni persona sana di 
mente, ma non mi sembra poi cosi' strano aspettare un'implementazione 
del genere fuori dal mondo win (e, ripeto, mozilla mi ha accontentato).
Ovviamente a meno che non ci siano altre maniere che mi sfuggono per 
fare chiamate asincrone al server (escludendo i vari workaround con 
frame, iframe e compagnia bella).

 parrebbe di si`, hai una URL per verificarlo?
Lo uso ad esempio in 
www.hardstore.com
 per ciclare le news nel box nella 
colonna centrale (e non ho fatto ancora i test col mac, per quello 
chiedevo).
A quanto ne so io ogni Netscape 7 e Mozilla 1.x dovrebbero implementarlo 
su ogni piattaforma (e hanno basato l'implementazione su quanto ha fatto 
ms; url a memoria: 
http://www.mozilla.org/xmlextras/
).

 server?
Ricordi il discorso della treeview che si fece? E' esattamente cosi' che 
funziona.. e finalmente ti stai dedicando anche tu al client side, eh? 
:P
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 server?
Si', esatto.
Il link che ti ho dato su 
mozilla.org
 era giusto, ma, per quanto 
riguarda xmlhttprequest, ti rimanda in fretta a msdn.
...dopo che hai storto il naso facci un giro...