Ciao a tutti, sono appena iscritto e poco esperto in javascript.
Sto sbattendo la testa su un problema che è probabilmente estremamente semplice da risolvere, ma dal quale non riesco a venirne fuori.
Per questo motivo, dopo aver fatto un po' di ricerca senza alcun risultato, chiedo a voi se qualcuno può darmi un semplice suggerimento in merito all'utilizzo di onreadystatechange = function() per poter ottenere il risultato del punto e):
a) utilizzo una semplice pagina html contente il codice che ho inserito sotto, senza alcuna necessità di connettermi a database o a server o a internet, ma lavorando solo ed esclusivamente in locale;
b) seleziono più file di testo, ad es. file XML, presenti nella stessa cartella del file html utilizzando il classico <input type="file" multiple /> (funziona perfettamente);
c) recupero i nomi ed i contenuti dei file selezionati (funziona perfettamente);
d) aggiungo alla fine della pagina corrente i nomi dei file selezionati (funziona perfettamente);
e) aggiungo, sempre alla fine della pagina, tutti i contenuti dei file selezionati --> non funziona correttamente.
Mi spiego meglio:
Ho pensato di recuperare i contenuti utilizzando:
- stampa.push(this.responseText) all'interno di onreadystatechange = function();
(ma ho provato anche con il più semplice
- stampa += this.responseText; in quest'ultimo caso cambiando ovviamente la tipologia di variabile)
e successivamente di aggiungere i dati alla fine della pagina utilizzando
- document.getElementById('listacontenuti').innerHTML = stampa.join('') (oppure semplicemente = stampa, se per recuperarli ho usato stampa +=).
Quello che ottengo è:
1) se uso document.getElementById('listacontenuti').innerHTML = dall'interno di onreadystatechange = function(), viene accodato sempre un solo contenuto, quello dell'ultimo file, perché probabilmente vengono "sovrascritte" le precedenti aggiunte;
2) se uso document.getElementById('listacontenuti').innerHTML = dall'esterno di onreadystatechange = function(), non viene accodato più nulla, come se la variabile stampa (che comunque è dichiara a livello superiore e mi aspettavo venisse letta e valorizzata in modo trasparente) venisse "azzerata".
Anche la variabile i (il contatore del ciclo for) si comporta allo stesso modo.
Il codice della pagina è il seguente (il comando document.getElementById('listacontenuti').innerHTML = stampa.join('') è ripetuto in più punti perché ho fatto vari tentativi, commentati a lato):
Ribadendo che sono neofita, spero di essere stato abbastanza chiaro e vi ringrazio per i suggerimenti.
Yader
Sto sbattendo la testa su un problema che è probabilmente estremamente semplice da risolvere, ma dal quale non riesco a venirne fuori.
Per questo motivo, dopo aver fatto un po' di ricerca senza alcun risultato, chiedo a voi se qualcuno può darmi un semplice suggerimento in merito all'utilizzo di onreadystatechange = function() per poter ottenere il risultato del punto e):
a) utilizzo una semplice pagina html contente il codice che ho inserito sotto, senza alcuna necessità di connettermi a database o a server o a internet, ma lavorando solo ed esclusivamente in locale;
b) seleziono più file di testo, ad es. file XML, presenti nella stessa cartella del file html utilizzando il classico <input type="file" multiple /> (funziona perfettamente);
c) recupero i nomi ed i contenuti dei file selezionati (funziona perfettamente);
d) aggiungo alla fine della pagina corrente i nomi dei file selezionati (funziona perfettamente);
e) aggiungo, sempre alla fine della pagina, tutti i contenuti dei file selezionati --> non funziona correttamente.
Mi spiego meglio:
Ho pensato di recuperare i contenuti utilizzando:
- stampa.push(this.responseText) all'interno di onreadystatechange = function();
(ma ho provato anche con il più semplice
- stampa += this.responseText; in quest'ultimo caso cambiando ovviamente la tipologia di variabile)
e successivamente di aggiungere i dati alla fine della pagina utilizzando
- document.getElementById('listacontenuti').innerHTML = stampa.join('') (oppure semplicemente = stampa, se per recuperarli ho usato stampa +=).
Quello che ottengo è:
1) se uso document.getElementById('listacontenuti').innerHTML = dall'interno di onreadystatechange = function(), viene accodato sempre un solo contenuto, quello dell'ultimo file, perché probabilmente vengono "sovrascritte" le precedenti aggiunte;
2) se uso document.getElementById('listacontenuti').innerHTML = dall'esterno di onreadystatechange = function(), non viene accodato più nulla, come se la variabile stampa (che comunque è dichiara a livello superiore e mi aspettavo venisse letta e valorizzata in modo trasparente) venisse "azzerata".
Anche la variabile i (il contatore del ciclo for) si comporta allo stesso modo.
Il codice della pagina è il seguente (il comando document.getElementById('listacontenuti').innerHTML = stampa.join('') è ripetuto in più punti perché ho fatto vari tentativi, commentati a lato):
Codice:
<html>
<head>
<title>
</title>
</header>
<body>
<h1>LISTA CONTENUTO FILE SELEZIONATI</h1>
<input type="file" id="filedaselezionare" name="files[]" multiple /><br/>
<script>
function handleFileSelect(evt) {
var files = evt.target.files;
var output = [], stampa = [], nomefile;
var xmlhttp = new XMLHttpRequest();
for (var i = 0, f; f = files; i++) {
output.push('<li>', escape(f.name), '</li>');
nomeFile = f.name ;
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
stampa.push(this.responseText);
document.getElementById('listacontenuti').innerHTML = stampa.join(''); // funziona ma aggiunge solo un contenuto perché probabilmente "sovrascrive" i precedenti
}
// document.getElementById('listacontenuti').innerHTML = "Stampa: " + stampa.join(''); // funziona anche questo, ma aggiunge sempre solo un contenuto perché probabilmente "sovrascrive" i precedenti
console.log(stampa);
};
xmlhttp.open("GET", nomeFile , true);
xmlhttp.send();
// document.getElementById('listacontenuti').innerHTML = stampa.join(''); // se esco dalla funzione onreadystatechange = function() non viene aggiunto più nulla alla pagina
}
// document.getElementById('listacontenuti').innerHTML = stampa.join(''); // anche in questo caso, al di fuori della funzione onreadystatechange = function() non aggiunge più nulla alla pagina
document.getElementById('listafile').innerHTML = '<ol>' + output.join('') + '</ol>'; // mi elenca, correttamente, la lista dei nomi dei file selezionati
}
document.getElementById('filedaselezionare').addEventListener('change', handleFileSelect, false);
</script>
<output id="listafile"></output>
<output ID="listacontenuti"></output>
</body>
</html>
Yader
Ultima modifica di un moderatore: