Newsgroup: it.comp.www.html
Titolo: [TUTORIAL / SCRIPT] Frame Dinamici

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.
Un metodo abbastanza semplice per risolvere questo problema e' il seguente:
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"
 document.write("<frameset  rows='50,*'>"+
     "<frame name='menu' src='menu.htm' marginwidth='10' marginheight='10'
scrolling='auto' frameborder='0'>" +
     "<frame name='main' src='"+_frame+".htm' 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";
     document.write("<frameset  rows='50,*'>"+
         "<frame name='menu' src='menu.htm' marginwidth='10'
marginheight='10' scrolling='auto' frameborder='0'>" +
         "<frame name='main' src='"+_frame+".htm' 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":
<html>
    <head>
        <script>
                if (self.location == top.location)
                    self.location="frame.htm?main=a";
        </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. :)
C'ya,
    ZER0

 ha scritto nel messaggio
news:8s74o7$a27$1...@fe2.cs.interbusiness.it...
