Newsgroup: it.comp.lang.javascript
Titolo: da hidden ad iframe...help!

Premetto che sono alquanto newbie per javascript ed ho questo problema.
Dovrei fare in modo che dei dati passino da un campo hidden ad un
iframe al caricamento della pagina. Su Firefox tutto ok su IE no.
Praticamente:
-questa funziona sia su IE che Firefox (e passa i dati iframe ->
hidden):
function Save()
    {
    if(document.all){
 	 document.form.buio.value = frames['mess'].document.body.innerHTML;
 	 //window.frames.mess.document.documentElement.outerHTML;
    }
    else{
    document.getElementById('buio').value =
document.getElementById('mess').contentDocument.body.innerHTML;
    }
    document.getElementById('form').submit();
}
-Questa solo su Firefox (e passa i dati hidden -> iframe):
[...]    if(document.all){
 	 frames['mess'].document.body.innerHTML = document.form.load.value
 	 //window.frames.mess.document.documentElement.outerHTML;
    }
    else{
    document.getElementById('mess').contentDocument.body.innerHTML =
document.getElementById('load').value;
    }
IE continua a darmi "object null or not an object" per
frames['mess'].doc.... ho provato già diverse modifiche in vano.

 frames['mess'].doc....
Verifica che esistano gli oggetti che invochi.
alert(window.frames["mess"]);
alert(window.frames["mess"].document);
alert(window.frames["mess"].document.body);
-- 
"Your sin is beyond the grace of God" ~ Ky Kiske

Non sono sicuro di aver capito bene cosa mi chiedi comunque ho fatto
vari tentativi cercando di seguire le tue istruzioni e il risultato non
cambia. La cosa che non capisco è perchè una funziona e la sua
inversa no. Cioè la funzione save() funziona senza problemi mentre
l'altra, che mi sembra semplicemente opposta no. Ad ogni modo gli alert
dano tutti esito positivo, almeno credo. (risondono tutti e 3
[object]). Comunque ti allego tutto lo script così forse riesco ad
essere più chiaro.
grazie in anticipo!
<script language="JavaScript">
var bHtmlMode = false;
var str_iFrameDoc = (document.all)?
"document.frames(\"mess\").document\;":
"document.getElementById(\"mess\").contentDocument\;";
// Inizializzazione
onload = initialize;
function initialize() {
	iFrameDoc = eval(str_iFrameDoc);
	iFrameDoc.open();
	iFrameDoc.write("<html><body></body></html>");
	iFrameDoc.close();
	iFrameDoc.designMode = "On";
    if(document.all){
 	 window.frames["mess"].document.body.innerHTML =
document.form.load.value;
 	 //window.frames.mess.document.documentElement.outerHTML;
    }
    else{
    document.getElementById("mess").contentDocument.body.innerHTML =
document.getElementById(\'load\').value;
    }
}
function Save()
    {
    /*if(document.all){
 	 document.form.buio.value = frames["mess"].document.body.innerHTML;
 	 //window.frames.mess.document.documentElement.outerHTML;
    }
    else{
    document.getElementById("buio").value =
document.getElementById("mess").contentDocument.body.innerHTML;
    }*/
    document.getElementById("buio").value =
window.frames["mess"].document.body.innerHTML;
    //document.getElementById("form").submit();
}
// Porta il focus al riquadro di testo
function setFocus() {
if (document.all)
	document.frames("mess").focus();
else
	document.getElementById("mess").contentWindow.focus()
return;
}
// Formatta il testo
function formatC(what,opt) {
	//if (!validateMode())
		//return;
	iFrameDoc = eval(str_iFrameDoc);
	iFrameDoc.execCommand(what,false,opt);
	setFocus();
}
//Scambia tra la modalità testo e la modalità HTML.
function setMode(newMode) {
	var testo;
	bHtmlMode = newMode;
	iFrameDoc = eval(str_iFrameDoc);
	riquadro = iFrameDoc.body;
	if (document.all) {
		if (bHtmlMode) {
			testo = riquadro.innerHTML;
			riquadro.innerText = testo;
		} else {
			testo = riquadro.innerText;
			riquadro.innerHTML = testo;
		}
	} else if(document.getElementById <xsl:text
disable-output-escaping="yes">&amp;&amp;</xsl:text>
document.createTextNode) {
		if (bHtmlMode) {
			testo = document.createTextNode(riquadro.innerHTML);
			riquadro.innerHTML = "";
			riquadro.appendChild(testo);
		} else {
			testo = document.createRange();
			testo.selectNodeContents(riquadro);
			riquadro.innerHTML = testo.toString();
		}	
	}
	setFocus();
}
</script>

 grazie in anticipo!
Purtroppo non ho tempo e modo di mettermi ad analizzarlo nel dettaglio (tra
l'altro vedo che è "contaminato" da XSLT); ad una velocissima lettura ho visto
che si tratta di un iframe in design mode.
Faccio prima a scriverti del codice funzionante, che puoi studiare e adattare
al tuo caso.
Inserisci in una pagina HTML questo come body:
<body>	
	<textarea id="my-text"></textarea>
	<br />
	<button onclick="fromTextToFrame()">copia nel frame</button>
	<br />
	<iframe src="about:blank" name="myframe"></iframe>
	<br />
	<button onclick="fromFrameToText()">copia nella textarea</button>
</body>
E come javascript:
	function fromTextToFrame(){
		window.frames["myframe"].document.body.innerHTML =
document.getElementById("my-text").value;
	}
 
	function fromFrameToText(){
		document.getElementById("my-text").value =
window.frames["myframe"].document.body.innerHTML;
	}
 
	window.onload = function(){
		window.frames["myframe"].document.designMode = "on";
	}
Vedrai che ti funzionerà sia su FF che su IE. Come vedi, non ci sono
"document.all" sparsi a giro.
-- 
"E' un vero peccato che tutte le persone che sanno come far funzionare 
il Paese siano troppo occupate a guidare taxi o a tagliare capelli."
(George Burns)

ZER0 ha scritto:

Innanzitutto ti ringrazio per la pazienza e disponibilità. Però ho
ancora un problema e guarda che caso con IE. Ho adattato i tuoi
suggerimenti così:
<script language="JavaScript">
        function fromTextToFrame(){
                window.frames["editor"].document.body.innerHTML =
document.getElementById("load").value;
        }
        function Save(){
                document.getElementById("load").value =
window.frames["editor"].document.body.innerHTML;
			//document.getElementById("edit").submit();
        }
        window.onload = function(){
        			fromTextToFrame();
                window.frames["editor"].document.designMode = "on";
        }
function formatC(what,opt) {
	window.frames["editor"].document.execCommand(what,false,opt);
}
</script>
Dove "Editor" è solo il name dell'iframe, gli altri sono id. Quello
che ora non capisco è perchè su FFè come al solito tutto a posto ma
su IE il passaggio fromTextToFrame funziona solo da bottone e non
onload, sbaglio a chiamare la funzione io? Anche la formatC (che
funziona su entrambi) su IE non "deformatta" un testo passato al frame
ad esempio già in grassetto. Perchè?
Scusa ancora se ti riempio di domande e grazie di nuovo in anticipo.

 ad esempio già in grassetto. Perchè?
Bisogna vedere in che contesto. Se ti riferisci sempre al discorso dell'onload
o no; l'HTML che vai a modificare e così via.


 o no; l'HTML che vai a modificare e così via.
L'idea è quella di realizzare un editor wysiwyg quindi ho dei bottoni
per formattare il testo, ma in IE se carico con la fromTextToFrame del
testo con già una precedente formattazione questa non è modificabile
tramite i bottoni che richiamano la FormatC(), es. un testo caricato in
grassetto resta in grassetto, posso aggiungere corsivo... ma il
grassetto non si toglie.

 grassetto non si toglie.
Sinceramente, non mi risulta. Se nel codice che ti ho fornito, aggiungo un
pulsante che richiama la seguente funzione:
	window.frames["myframe"].document.execCommand("Bold",false);
E tramite "fromTextToFrame" inserisco un codice HTML che ha il bold
(esempio: "this is a <b>text</b>.."), ottengo l'effetto desiderato.
Puň darsi che il tuo errore sia altrove, eventualmente se non riesci a
identificarlo, prova a pubblicare online il codice che stai utilizzando in
modo da replicare l'effetto indesiderato, cosě che possa darci un occhio e
capire cosa non va.
-- 
"Non č una guerra.. č uno sterminio.. loro stanno a noi come 
uomini contro i  vermi.. draghi contro i lupi.. 
O uomini che cavalcano draghi e lanciano lupi addosso ai vermi!"

potrebbe essere dato dal fatto che FF e IE producono codice diverso con
il comando execCommand[...]? Mi spiego meglio:
FF produce "<span style="weight:bold">text</span>;
IE produce "<strong>text</strong>
Questo ovviamente con la FormatC, adesso provo a mettere i comandi
diretti come mi hai suggerito tu e vedo che succede.