Newsgroup: it.comp.lang.javascript
Titolo: aprire una pagina dentro un frameset

Ciao a tutti.
Ho letto un vecchio post, ma ho dei problemi...
<virgolette>
Ho deciso di postare questo messaggio dopo aver letto parecchi post di
richiesta sull'argomento, sperando che possa essere d'aiuto o cmq fonte di
ispirazione a qualcuno.
In un vecchio post qualcuno mi aveva domandato come realizzare Frame
Dinamici, ma purtroppo a suo tempo ero un po' preso per poter dare una
risposta esauriente come questa.
Spero di poter rimediare con questo post. :)
Mi e' parso di capire che l'apertura diretta di pagine che "dovrebbero"
stare dentro ad un frameset e' un problema comune di molte persone.
Tali persone vorrebbero far si' che una volta richiamata da browser la
pagina "x", si aprisse tale pagina non a se' stante, ma collegata al suo
frameset originario.
Il "problema" e' che spesso la pagina "x" non e' specificata nella sorgente
del
frameset, ma ci si arriva tramite navigazione.
Supponiamo di avere una pagina a frame di questo tipo:
<frameset  rows="50,*">
    <frame name="menu" src="menu.htm" marginwidth="10" marginheight="10"
scrolling="auto" frameborder="0">
    <frame name="main" src="main.htm" marginwidth="10" marginheight="10"
scrolling="auto" frameborder="0">
</frameset>
E supponiamo di avere tre pagine:
a.htm, b.htm e c.htm
Queste tre pagine, se richiamate, non devono aprirsi da sole, ma devono
aprirsi nella struttura sovra indicata, al posto di "main.htm".
Ora, se vengono richiamate tramite navigazione, il problema non si pone,
perche' verra' fatto un link settando un target adeguato.
Ma supponendo che vengano richiamate da sole?
Si deve forzare la loro apertura li' dentro.
Cio' significa che nella struttura che abbiamo visto poc'anzi, il frame di
nome "main" non e' fisso, ma "variabile".
A questo punto, la struttura del frame diventa, con un po' di javascript:
<script>
    var _frame="main.htm"
document.write("<frameset  rows='50,*'>"+
     "<frame name='menu' src='menu.htm' marginwidth='10' marginheight='10'
scrolling='auto' frameborder='0'>" +
     "<frame name='main' src='"+_frame+"' marginwidth='10'
marginheight='10' scrolling='auto' frameborder='0'>");
document.close();
</script>
In questo modo, cosa abbiamo realizzato?
Un semplice frame che ha come source del "main", una variabile javascript.
Cosi' com'e', l'effetto finale e' identico al sorgente in HTML puro, ma
adesso abbiamo un vantaggio: la sorgente del main, essendo una variabile js,
puo' essere modificata al volo.
L'unica cosa da fare, adesso, e' trovare un modo per passare al frameset il
valore della pagina che ci interessa.
Ci sono diversi modi.
Il piu' semplice e' sicuramente passare il parametro tramite querystring.
Ovvero, supponendo che io volessi richiamare in quel frame (che si chiama,
ad esempio, frame.htm) la pagina "a.htm", l'url sara':
frame.htm?main=a.htm
Adesso dobbiamo recuperare tale dato.
Non e' difficile, ma per semplificarci ulteriormente la vita usero' una
funzione che ho realizzato e che si puo' trovare su 
www.jsdir.com
 sotto la
voce
"userscript/utility", il suo nome e' "queryString()".
Tale funzione recupera difatti dalla url tutti i valori passati a quella
pagina e realizza un array corrispondente.
E' una funzione molto semplice da usare e molto utile in casi come questi.
Lo script diventera' quindi:
<script>
    /*
    recuperiamo i dati dalla query string.
    se e' stato passato qualcosa, allora recupera l'argomento "main",
    altrimenti setta per default la variabile _frame a "main".
    */
    var args=queryString(),
        _frame=(args.length>0)?args["main"]:"main.htm";
     document.write("<frameset  rows='50,*'>"+
         "<frame name='menu' src='menu.htm' marginwidth='10'
marginheight='10' scrolling='auto' frameborder='0'>" +
         "<frame name='main' src='"+_frame+"' marginwidth='10'
marginheight='10' scrolling='auto' frameborder='0'>");
     document.close();
</script>
E con questo abbiamo finito la pagina "frame.htm".
Abbiamo realizzato una pagina che, dipendentemente dagli argomenti passati,
carica nel frame "main" un documento piuttosto che un'altro.
Ora, l'unica cosa che c'e' rimasta da fare, e' modificare le pagine a.htm,
b.htm e c.htm in modo tale che se vengono chiamate al di fuori del frameset,
esse richiamano la pagina "frame.htm", passandogli se' stesse, in modo tale
da poter essere caricate.
Banalmente, per caricare la pagina "a.htm":
<html>
    <head>
        <script>
                if (self.location == top.location)
                    self.location="frame.htm?main=a.htm";
        </script>
    </head>
<body>
.
.
<!-- contenuto delle vostre pagine -->
.
.
</body>
</html>
E cosi' via..
Spero di essere stato di aiuto e di essere stato esauriente.
Ho postato questo "mini tutorial" / script perche' potesse essere usato
liberamente senza alcun problema, cmq se pensate che vi possa essere di
aiuto in qualche modo ci terrei a saperlo, mi farebbe piacere. :)
</virgolette>
Ho provato a fare come spiegato, ma ho un problema.
Il problema č che quando provo a visualizzare la pagina con il
document.write, anzichč mostrarmi il frameset mi viene mostrato quello che č
nel <body>; ho notato comunque che se io inserisco un document.write con un
frameset "non dinamico", il frameset si vede, mentre se provo solo ad
aggiungere solo le prime due righette dove si dichiarano le due variabili
non funziona piů.
Qualche aiuto?
Ciao e Grazie mille,
DoZ.

A prima vista non mi funziona nemmeno questo:
http://www.jsdir.com/faq/faq.asp?espandi=cercanumero&numero=419
Comincio a credere di aver qualcosa che non va nei settaggi di explorer, ma
guarderň meglio.
:-(

Sto provando questo: mi va in locale, ma sul server (IIS) NO!
Ho fatto una funzione in un file esterno che poi richiamo all'interno del
file html:
function inframe(url){
if (self.location==top.location)
   {
document.write("<frameset rows='80,1*' cols='*' frameborder='NO' border='0'
framespacing='0'> "+
"  <frame name='top' scrolling='NO' noresize src='../top.htm' >"+
"  <frameset cols='150,1*' frameborder='NO' border='0' framespacing='0'> "+
"    <frame name='menu' noresize scrolling='NO' src='../menu.htm'>"+
"    <frame name='pag' src='"+url+"'>"+
"  </frameset>"+
"</frameset>");
   }
}
Le pagine dove verrà richiamata la funzione sono tutte in una sottocartella
rispetto ai file "menu" e "top".
Nel file html:
<body onLoad="inframe('../home/pag.htm');">
In locale funziona.
In server mi da:
<frameset rows='80,1*' cols='*' frameborder='NO' border='0'
framespacing='0'>   <frame name='top' scrolling='NO' noresize
src='../top.htm' >  <frameset cols='150,1*' frameborder='NO' border='0'
framespacing='0'>     <frame name='menu' noresize scrolling='NO'
src='../menu.htm'>    <frame name='pag' src='../home/pag.htm'>
</frameset></frameset>
...che è la stessa che mi da in locale, però non mi carica la pagina
principale "home/pag.htm".
AIUTO?!