Newsgroup: it.comp.lang.javascript
Titolo: [explorer] appendChild su IFrame?

Salve a tutti.
Spero possiate aiutarmi perche' ho un problema piuttosto pressante che
devo risolvere in qualche modo.
La situazione e' semplice.
Io ho una pagina con dentro un iframe. Questa pagina apre un popup
nella quale vengono creati degli elementi (vedi createElement) che alla
fine devono essere appesi al BODY della pagina contenuta nell'IFRAME.
Il seguente comando funziona PERFETTAMENTE su FirefoX/Mozilla:
window.opener.document.getElementById
('iframe').contentWindow.document.body.appendChild (new_node);
od anche la sua variante:
window.opener.document.getElementById
('iframe').contentWindow.document.getElementById ('body').appendChild
(new_node);
(dove il tag body ha un id body che e' brutto ma e' per fare una prova)
Explorer invece non riesce ad eseguire bloccandosi e non dandomi
apparenti messaggi di errore.
Cercando per ore sulla rete, ho scoperto che appendChild funziona su
exploder solo se viene specificato un DOCTYPE cosa che prontamente ho
fatto (sia nella pagina che nel popup) ma la funzione ancora non
funziona.
Ho fatto quindi una prova stupida aggiungendo un semplice DIV al body
senza avere passaggi su finestre e iframe (in pratica nella pagina
stessa) e tale prova funziona anche su IE.
document.body.appendChild (new_node);
Ho provato quindi a complicare di poco la prova aggiungendo un IFRAME
ma come prima la funzione non viene eseguita.
document.getElementById ('iframe').contentWindow.body.appendChild
(new_node);
Come posso risolvere questo problema? Possibile che Exploder che
notoriamente implementa millemila funzioni fighissime, non preveda una
semplice aggiunta di un nodo?
Grazie per ogni eventuale suggerimento.

 devo risolvere in qualche modo.
[CUT]
Premesso che non ho mai avuto questa necessità (e quindi parlo solo di
teoria), nell'msdn vedo che contentWindow restituisce l'oggetto *window* di
un *iframe*.
Non vorrei (anche se mi puzza) che il riferirsi all'oggetto con
getElementById crei problemi. 
Non vorrei inoltre (questa è più probabile, anche se è strano che i browser
Gecko funzionino e IE, che notoriamente digerisce di tutto, si incazzi) che
l'id del frame ("iframe") crei problemi in quanto reserved word.
Hai provato con (assegnato al frame name="MyFrame")
 opener.frames["MyFrame"].contentWindow.... ?
 Oppure direttamente (contentWindow non serve)
 opener.frames["MyFrame"].document.getElementsByTagName("body")[0]....?
Se non va: non puoi usare innerHTML (non standard ma supportato da tutti i
browser)?
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

Innanzitutto grazie per la veloce risposta (e soprattutto per avermi
risposto visto che su altri forum piu' blasonati notoriamente vengo
ignorato... )
L'ID "iframe" l'ho scritto cosi' ma solo per farvi capire. In realta'
si chiamo con un nome che non e' reserved.
Per quanto concerne il discorso dell'oggetto window, ho provato varie
combinazioni ma sembra sempre che explorer non le digerisca.
Potete provare a fare una prova:
<html>
<head>
<script type="text/javascript">
     function fai ()
     {
           var obj = document.createElement ('div');
           obj.innerHTML = "topolino";
           document.getElementById
('pippo').contentWindow.body.appendChild (obj);
     }
</script>
</head>
<body>
  <input type="button"  value="fai" onclick="fai()" />
  <iframe id="pippo" width="300" height="300" />
</body>
<html>
vedrete che su Volpe di Fuoco funziona ma non su Esploratore.
Ringrazio ancora anticipatamente per ogni suggerimento.
Grazie e alla prsosima...

 ('pippo').contentWindow.body.appendChild (obj);
Così come hai scritto non va neanche con firefox ("body non è un oggetto").
Comunque sia ho visto il problema (probabilmente tra le 1000 prove che hai
fatto hai postato quella errata).
workaround possibili che mi vengono in mente:
a)  MyWin=frames["pippo"];
MyWin.document.getElementsByTagName('body')[0].innerHTML+="<div>ok</div>";//testata
e funzionante con IE6
b) Potresti provare (questa non la ho tentata) a mettere una function nella
pagina che apri nell'iframe che riceve un oggetto e esegue l'appendChild, e
chiamarla con MyWin.nomefunzione(obj);Come ti dicevo: non tentata, ma non
vedo perché non dovrebbe andare.
Entrambi i casi richiedono che tu apra una pagina nell'iframe (un
"vuota.htm").
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

Ciao.
Allora. Ho risolto il problema col barbatrucco dell'innerHTML. In
pratica:
var prec =
window.opener.document.getElementById('rte1').contentWindow.document.getElementById
('body').innerHTML;
window.opener.document.getElementById('rte1').contentWindow.document.getElementById
('body').innerHTML = prec + new_element.innerHTML;
In questo modo riesco ad aggiungere in coda il contenuto del nuovo
elemento.
Tuttavia ho appena scoperto con sgomento, che explorer non sembra
accettare un setAttribute dove l'attribute e' lo style.
Provare per credere:
function fai (str)
            {
               var obj = document.createElement ('div');
               var obj2 = document.createElement ('div');
               obj2.setAttribute ('id','interno');
               obj2.setAttribute ('style','color:#FF0000');
               obj.innerHTML = 'un testo inutile';
               obj2.innerHTML = 'vedi sopra';
               obj.appendChild (obj2);
               alert (obj.innerHTML);
            }
Volpe di Fuoco stampa correttamente mentre Esploratore stampa il DIV
interno con l'attributo ID ma non quello style.
Che spiegazione logica c'è dietro? Su MSDN non fanno menzione ad uno
style ignorato.
Grazie e alla prossima...

                obj2.setAttribute ('style','color:#FF0000');
Non so di questo, ma IE è completamente bacato sul createElement.
Il consiglio che viene sempre dato è di creare l'elemento per IE
specificando l'intero tag.
Se cerchi in giro trovi un mare di documentazione su questi problemi per
quanto riguarda tag input type="text".
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 non preveda una semplice aggiunta di un nodo?
Cosa che viene notoriamente fatta. Credo che il tuo sia un problema di
"scoping". Immagino che "new_node" venga creato dal documento corrente, e
non dal documento che poi andrà a riceverlo.
Il problema sta tutto qua.
-- 
.ZER0//sign
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 Che spiegazione logica c'è dietro? 
La stessa che c'è per gli event-handler, suppongo.


Grazie per le dritte. Se FireFox me lo passa, vedo di usare
quell'istruzione specifica per settare lo style direttamente senza
usare il setAttribute.
Per quanto concerne la appenChild di cui sopra, effettivamente
l'elemento viene creato nella finestra di popup corrente e quindi
aggiunto tramite un comando che va a pescare, nell'opener, l'iframe
specifico appendendo al Body.
Come detto su Firefox/Mozilla funziona e quindi mi aspettavo che
funzionasse anche sotto Exploder. Evidentemente lo sopravvalutavo.
Ora faccio la prova con style e poi vi faccio sapere.
Comunque vi ringrazio enormemente per l'aiuto che mi state dando.
Ciao e alla prosisma...

 Comunque vi ringrazio enormemente per l'aiuto che mi state dando.
De nada.
