Newsgroup: it.comp.lang.javascript
Titolo: Re: parent.frames['sotto'].ecc non è un oggetto

 "parent.frames['sotto'].ecc non è un oggetto"?
Il messaggio di errore dovrebbe essere diverso, ma probabilmente dipende
dal client usato. Il problema è dato dalla SOP: Same Origin Policy. Non
puoi manipolare una pagina che non sia nel tuo stesso dominio. Quindi
significa che se il tuo frameset si trova in locale, e "sotto" sul web,
riceverai un errore di "accesso negato" appena tenti di accedere al
documento.
-- 
ZER0
~ The Tangent Universe collapsed 5974 days, 9 hours, 24 minutes and 40 seconds ago.

 Sembra... ma non sembrerebbe :)
Beh, prova un check di questo tipo:
if (typeof parent.sotto!="undefined"){
	if (typeof parent.sotto.document!="undefined"){
		if (typeof parent.sotto.document.forms["nomeform"]!="undefined"){
			if (typeof
parent.sotto.document.forms["nomeform"].nomecampo!="undefined"){
				alert("c'è tutto :)");
			}else{
				alert("parent.sotto.document.forms[\"nomeform\"].nomecampo è
undefined");
			}
		}else{
			alert("parent.sotto.document.forms[\"nomeform\"] è undefined");
		}
 
	}else{
		alert("parent.sotto.document è undefined");
	}
}else{
	alert("parent.sotto è undefined");
}
più debugging brutale di questo, si muore :)
-- 
ZER0
~ The Tangent Universe collapsed 5974 days, 10 hours, 9 minutes and 7 seconds ago.

 permissivo la SOP rimane.
In locale le restrizioni sono diverse, forse è per questo che in locale
funziona.
Catarsi sei sicuro che mettendolo in linea, al di là di questo problema, le
manipolazioni di cui parli funzionano?
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 manipolazioni di cui parli funzionano?
Magari gli interessa solo in locale.
-- 
ZER0
~ The Tangent Universe collapsed 5974 days, 10 hours, 31 minutes and 23 seconds ago.

 Eh sì :)
I bei vecchi metodi. :)
-- 
ZER0://coder.gfxer.web-designer/
~ Non esistono donne brutte. Dipende solo da quanta vodka bevi.
(proverbio russo)

 utilizzare questo. (A me risulta che IE 6 però non lo supporti.)
IE6 lo supporta sicuramente. Le versioni precedenti di IE su windows mi sà
di no, ma fa relativamente poco testo in quanto IE5/Mac non ha niente a che
spartire con IE5/Win.. quindi è una cosa che va semplicemente verificata.
-- 
ZER0
~ The Tangent Universe collapsed 5975 days, 4 hours, 12 minutes and 3 seconds ago.
on air ~ "Gianluca Grignani - Che ne sarà di noi"

 occhi) che la pagina sia interamente caricata e poi parto ;)
L'errore sembrerebbe proprio questo. Vuoi accedere alla pagina prima che
si sia caricata.
Puoi fare cosě:
function poll()
{
   if
   (
     parent.frames['sotto'].document &&
     parent.frames['sotto'].document.forms['nomeform'] &&
     parent.frames['sotto'].document.forms['nomeform'].nomecampo
   )
     doSomething();
   else
     setTimeout(poll, 500);
}
Abbiamo costruito il nostro "evento" onload:-)
Gaetano

> if (typeof parent.sotto.document.forms["nomeform"]!="undefined"){
Mi è sorto un sospetto.
Oltre al codice che ti ho scritto:
if (typeof parent.sotto.document.forms!="undefined"){
	alert("la collection forms esiste, ed ha "+
		parent.sotto.document.forms.length+" elementi.");
}else{
	alert("la collection forms non esiste.");
}
Prova a fare anche:
var doc=parent.sotto.document;
alert("document è null? : "+(doc==null)+
	"\ntypeof di document:"+(typeof doc) );
 
Magari in IE5/Mac, se document non esiste - in quanto non caricato - non è
"undefined" ma "null".
In tal caso si spiegherebbe come mai passa il check precedente, ma non
quello successivo: null è considerato di tipo object; quindi è sì diverso
da "undefined".. ma in quanto "null" non possiede alcuna proprietà, tanto
meno la collection "forms".
E da lì il messaggio di errore che ti viene.
Fammi sapere.
-- 
ZER0
~ The Tangent Universe collapsed 5975 days, 4 hours, 17 minutes and 40 seconds ago.


 non compare nessun alert e viene segnalato il solito errore.
Questo è ovvio.
Perchè un oggetto "undefined" (document.nomeForm) non può avere alcuna
proprietà (nomeCampo), quindi in questo check tu gli stai dicendo "mi
controlli il typeof della proprietà dell'oggetto document.nomeForm?"
e lui ti risponde "guarda che io mi aspetto che document.nomeForm sia un
oggetto, visto che vuoi sapere il typeof di una sua proprietà.. se non lo è
che diamine vuoi che controlli?" e da qui l'errore che ti viene.
Quindi è normale.
Non è normale, invece, che ti dia lo stesso errore qui:
document.forms["nomeForm"]
In quanto se ti dà un errore, significa che per lui document.forms non è un
oggetto del quale ricavare un'eventuale proprietà (ovvero nomeForm).
E qui, sta l'anomalia.
Perchè, come spiegato poc'anzi, per avere un errore di questo tipo,
significa che document.forms non è un oggetto. O non lo è document.
Ma dato che document PASSA il check con il typeof, significa che non può
essere "undefined", e quindi l'unica cosa rimanente è che sia euguale a
null; O che document sia effettivamente un oggetto, ma che document.forms
non lo è. In entrambi i casi, siamo davanti ad un'anomalia.
Può anche darsi che vi sia una diversa spiegazione, ed è questo che sto
cercando di appurare.
-- 
ZER0
~ The Tangent Universe collapsed 5975 days, 6 hours, 3 minutes and 19 seconds ago.

 spartire con IE5/Win.. quindi è una cosa che va semplicemente verificata.
Ho ricontrollato ed in effetti IE 6 lo supporta...
Gaetano

 si sia caricata.
Non esattamente, in verità. E' per questo che gli ho proposto una serie di
debug brutali; per capire il comportamento anomalo del suo browser.
Il primo codice di debug che gli ho postato io, difatti, non sarebbe dovuto
andare mai in errore. Bensì avrebbe dovuto notificare quale oggetto fosse
undefined.
Invece va in errore (il medesimo errore di oggetto non esistente) in questa
riga:
parent.sotto.document.forms["nomeform"]!="undefined"
E l'unico caso in cui possa andare in errore qui, dato il codice che ho
scritto in precedenza (ovvero esegue tale istruzione SOLO se
parent.sotto.document è diverso da undefined) è che esista sì il document,
ma non esista la collection forms.
E questo mi pare decisamente anomalo.
Tra l'altro, può anche darsi che non vi sia motivo di scomodare JS per
risolvere il problema in sè, almeno se IE5 su Mac supporta l'evento onload
sui frame/iframe (cosa che IE6 e Firefox, ad esempio fanno.. almeno per
quanto riguarda il tag iframe, i frame sono da una vita che non li uso ergo
non ci metto la mano sul fuoco).
Nel caso non dovesse essere supportato l'evento onload, e l'anomalia si
rivelasse la "non esistenza" della collection forms, allora si potrebbe
pensare a scrivere del codice sostitutivo a tale evento.
Lo scopo del codice che ho scritto fin'ora, serve a capire innanzitutto se
c'è realmente un'anomalia, e isolarla.
Nella mia esperienza personale non mi è mai capitata una cosa del genere.
E' anche vero, che raramente ho avuto modo di sperimentare codice JS su
IE5/Mac.
-- 
ZER0
~ The Tangent Universe collapsed 5975 days, 3 hours, 20 minutes and 6 seconds ago.

 non ci metto la mano sul fuoco).
Se disponibile l'evento onload sul tag IFRAME č sicuramente meglio
utilizzare questo. (A me risulta che IE 6 perň non lo supporti.)
Gaetano

 Fine delle anomalie. 
Eh. magari.
Prova ad eseguire quest'altro codice di "debug":
if (parent.sotto){
	if (parent.sotto.document){
		if (parent.sotto.document.forms){
			if (parent.sotto.document.forms["nomeform"]){
				if (parent.sotto.document.forms["nomeform"].nomecampo){
					alert("c'è tutto :)");
				}else{
					alert("parent.sotto.document.forms[\"nomeform\"].nomecampo non
presente");
				}
			}else{
				alert("parent.sotto.document.forms[\"nomeform\"] non presente");
			}
		}else{
			alert("parent.sotto.document.forms non presente.");
		}
	}else{
		alert("parent.sotto.document non presente");
	}
}else{
	alert("parent.sotto presente");
}
Un check così generico verifica che l'elemento in questione sia diverso da
null, undefined, false, 0 o stringa vuota.
In questo modo, se anche nella frazione di secondo in cui viene caricata la
pagina, per qualche motivo invece di essere a "undefined", una proprietà
viene settata a "null", non dovrebbe passarti il check.
Fammi sapere :)
-- 
ZER0
~ The Tangent Universe collapsed 5975 days, 7 hours, 34 minutes and 29 seconds ago.

 una funzione ricorsiva? 
Te lo sconsiglio, dovresti mettere il tutto su un evento, tipo il click di
un pulsante, e provare a cliccarlo selvaggemente. Altrimenti se inserisci
quel codice, pieno di alert, in una funzione ricorsiva č la fine. :)
Se si trattasse di firefox, con la sua console, basterebbe utilizzare la
funzione di dump().
P.S.
Ho visto stamane i messaggi che mi hai mandato ieri; presumo che in un modo
o nell'altro tu abbia fatto ;)
Appro', hai provato a vedere se l'evento onload č supportato da IE5/Mac,
sul frame/iframe?
-- 
.ZER0//sign
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)