Newsgroup: it.comp.lang.javascript
Titolo: [?2] Come passare il contenuto di un IFRAME ad una DIV

Ciao a tutti,
riposto il messsaggio sperando che questa volta qualcuno
possa aiutarmi.
Ho la necessetà di inserire dentro un pagina del codice
HTML
precedentemente salvato su file; per far questo utilizzo un IFRAME
nascosto
in cui carico il file e poi passo il contentuto dell'IFRAME in
una DIV: e
qui nascono i problemi!
L'accesso alla innerHTML dell'IFRAME
mi dà errore,
ma magicamente funziona tutto se inserisco un alert() subito
dopo il
caricamento del file.
Qui un sunto del codice che mi tormenta:
<IFRAME ID="buffer" STYLE='display:none'>
<DIV ID="cont"></DIV>
function openWindow(obj_id, source)
{
document.all["buffer"].src =
source;
  alert("OK");       <---- Senza
questa non funziona!!!
document.all["cont"].innerHTML =
document.frames["buffer"].document.body.innerHTML;
obj_id.style.visibility
= "visible";
}
Forse sono problemi di timeout: io ho provato ad
inserire cicli di attesa, polling sulla readyState dell'IFRAME,
setTimeout() sull'istruzione incriminata, ma non ne ho cavato niente;
sembra che solo la alert() risolva il problema e non capisco perchè!
Ovviamente per ora il codice è
soltanto per IE5, ma se non riesco a farlo
funzionare è inutile che lo
implemento in maniera x-browser.
Confido in
un vostro aiuto.
Ciao.
Princi
--------------------------------
Inviato via 
http://usenet.iol.it

Purtroppo non ho la soluzione al tuo problema, anzi, te lo complico ancora
un po':
non ne sono sicura la 100% ma mi pare che gli IFRAME con Netscape
non funzionino


 ha scritto nel messaggio
news:151Z28Z120Z212Y...@usenet.iol.it...

Premetto che non uso mai iframe comunque so che per far riferimento ai
frames si deve usare:
parent.nomeframe, forse è questo che da problemi.
Prova a scrivere in questo modo (è solamente una prova!!!!):
function openWindow(obj_id, source)
{
document.all["buffer"].src =source;
parent.cont.innerHTML = parent.buffer.body.innerHTML
obj_id.style.visibility= "visible";
}
Ciao
Alessia

Non vorrei dire cavolate, ma è possibile che i comandi senza la pausa in
mezzo non riescono a caricare la pagina in iframe?
Mi spiego meglio;
document.all["buffer"].src = source;  // questo va bene
document.all["cont"].innerHTML =
document.frames["buffer"].document.body.innerHTML; // questo non funziona
perché l'iframe non si è ancora caricato
se ci metti l'alert in mezzo l'iframe ha il tempo di caricarsi.
Usavo l'iframe (in modo legermente diverso) e mi sono trovato bene, ma per
quanto sappia io non è compatibile con NN.
   Vlad

 se ci metti l'alert in mezzo l'iframe ha il tempo di caricarsi.
Speravo anche io che fosse solo questione di tempo, ma con dei cicli di
attesa o tramite la setTimeout si dovrebbe riuscire a risolverlo, invece IE
mi da proprio "errore nella visualizzazione della pagina" quando accede alla
innerHTML
(fosse solo vuota basterebbe aspettare che si carichi!) In effetti il
problema da te evidenziato esiste e si verifica *dopo* quello che mi blocca
l'esecusione dello script, ma almeno questo è risolvibile aspettando un po'
prima di spostare tutto nella DIV.
Altre idee??? comincio a di-sperare :-((
Ciao.
--
Princi, 
princ...@programmer.net
---------------------------------------------------------------------
"Tutti sanno che una cosa è impossibile da realizzare,
finché arriva uno sprovveduto che non lo sa e la inventa." A.E.

 non funzionino
Ciao,
NN per ora non è un problema (userò gli ILAYER che sono anche meglio!);
è su IE che non riesco a venirne fuori :-((


 parent.cont.innerHTML = parent.buffer.body.innerHTML
Ciao,
prova *fallita*, ma me lo aspettavo :-(
così non funziona proprio, nè con nè senza la alert();
Nuova idea: tramite VBS e l'oggetto FSO è possibile fare un parser del file
.html su server e restituirne il contenuto al JS che gira su client??? Se si
potesse elimino l'IFRAME e mi semplifico la vita :-) Qualcuno ne sa
qualcosa?


 ha scritto nel messaggio
news:151Z28Z120Z212Y...@usenet.iol.it...

Finche' la pagina non e' caricata completamente non puoi leggerla;
non avendo un evento onLoad su IFRAME credo si possa solo ritardare la
lettura con un setTimeout
---------------------------
function openWindow(obj_id, source) {
 document.all["buffer"].src = source;
 obj=obj_id
 setTimeout('sposta(obj)',2000)
}
function sposta(obj_id){
 document.all["cont"].innerHTML =
document.frames["buffer"].document.body.innerHTML;
 document.all[obj_id].style.visibility = "visible";
}
--------------------------------------
IFRAME e innerHTML funzionano solo con IE e NS6
Con NS4.x puoi caricare un file di testo solo in un frame (il layer non
accetta il formato)
e non puoi leggerlo.
Saluti, Paolo

 --------------------------------------
Grazie! Grazie! Grazie! Funziona!
Ora però mi devi una piccola spiegazione: che era un problema di timeout me
ne ero accorto e, credimi, con il setTimeout le avevo già provate tutte ma
continuava a darmi errore!
Il problema era che io passavo alla funzione "sposta" direttamente *obj_id*,
senza prima assegnarlo ad una variabile locale come hai fatto tu. Ora mi
chiedo, come diavolo vengono gestiti i parametri formali dal JavaScript???
(di JS in effetti non ne so molto e probabilmente dò per scontato qualcosa
che scontato non è).
Perchè è necessario assegnare obj_id ad una variabile locale prima di
passarlo ad una funzione???
Intanto ti ringrazio di cuore (e dire che sono stato più volte ad un passo
dalla soluzione e non mi è mai venuto in mente che poteva essere un errore
nel passaggio dei parametri!)


 passarlo ad una funzione???
[]
Gli argomenti di una funzione sono variabili locali che esistono solo
nell'ambito della funzione.
Quando il metodo setTimeout valuta l'espressione la funzione chiamante
e' gia' terminata e quindi le variabili locali sono uscite dall'area di
validità e non esistono piu'.
Anche la variabile obj si comporta nello stesso modo se viene dichiarata
var.
Le possibilita' sono due:
a) utilizzare una variabile globale (come nel codice proposto)
b) passare direttamente il valore
    setTimeout('sposta('+obj_id+')',2000) // che equivale a
.....sposta('cont')...
Nel primo caso quando setTimeout valuta l'espressione utilizzera' il
valore della variabile globale obj nel secondo caso il valore e' gia'
nell'argomento.
Spero di essere stato sufficientemente chiaro.
Saluti, Paolo

 qualcosa?
Si, ma il server dovrebbe essere WinNT, la pagina dovrebbe essere in pratica 
ASP, e dovresti anche avere accesso al File System.
In sostanza non puoi usare FSO sul client e leggere un file sul server, devi 
usare FSO sul server: 
http://www.aspitalia.com
Naturalmente questo metodo è cross-browser, perché fai tutto lato server.
E' una cosa fattibile anche se richiede un po' di lavoro, guarda la pagina 
http://www.torchetti.it/ricette.asp
 per capire come passo i dati letti dal 
database ai layer.
-- 
Ciao, Riccardo
------------------------------------------------------------------------
WebMaster: ----> 
http://www.jsdir.com
 <---- (aka 
http://www.jspoint.it
)
              All the JavaScript you need
------------------------------------------------------------------------
               Nessun traguardo è abbastanza lontano.
------------------------------------------------------------------------