Prendendo atto del fatto che è una richiesta espressa con frequenza (anche dal sottoscritto in passato), pubblico qui un javascript che serve per ricostruire il layout di un sito a frame/iframe qualora venisse richiamata una pagina interna.
L'utilità è palese: arrivando a una pagina interna (magari da un motore di ricerca), questo js ricostruisce la corretta struttura del frameset ponendo nel frame "del contenuto" la pagina, e ricaricando nel contempo l'altro (o gli altri) frame contenenti menu di navigazione, barre laterali ecc.
Bene, si comincia! Questo esempio presuppone che il layout consista in un un singolo iframe centrale dove caricare i contenuti, mentre il menu è direttamente nel codice dell'index.
Quindi apriamo index.htm, individuiamo il codice del frameset (o dell'iframe), che andremo a sostituire con:
codice:
<script type="text/javascript">
var pagdef = 'pagina1.htm';
/* pagina che deve aprirsi normalmente nell'iframe */
var larghezza = 640
var altezza = 300
/* Questi valori possono anche essere espressi rispetto alle
misure disponibili a una data risoluzione, così:*/
/* var altezza=((screen.height)/2)-300; */
var pagstrin = location.search.substr(1);
var NS4 = (document.layers) ? true : false ;
if((location.search.substr(1)) == ''){pagina = pagdef;}
else{pagina = pagstrin;}
if(NS4){
document.write('<ilayer id="d1" width="'+larghezza+' height="'+altezza+'">');
document.write('<layer id="d2" src="'+pagina+'" width="'+larghezza+'"');
document.write('height="'+altezza+'"><\/layer><\/ilayer>');}
else{
document.write('<iframe src="'+pagina+'" name="main"');
document.write('width="'+larghezza+'" height="'+altezza+'"><\/iframe>');}
</SCRIPT>
Cosa fa questo? Semplicemente scrive la struttura dell'iframe (frameset) attraverso JS, per poterla poi richiamare cambiando la variabile PAGINA nel caso la richiesta arrivi da una pagina esterna.
Come vediamo, fa anche un controllo di browser: se trova netscape, usa il tag ILAYER (ma questo controllo può anche essere cancellato)
Ok, così ci apriamo la nostra index con la pagina di default (qui pagina1.htm) nell'iframe / frameset.
Le pagine esterne dovranno contenere questo codice:
codice:
<script type="text/javascript">
if (window.top == window.self) {
location.href='index.htm?'+document.URL }
</script>
Che, in parole povere, dice: se io sono aperta in modalità stand-alone, vatti a prendere la index, e metti il mio nome (di pagina) al posto del valore di pagina principale.
Fin qui abbiamo visto l'esempio nel caso dell'iframe. Nel caso del frameset, basta andare a cambiare il codice nella index, sostituendo in document.write('....') il codice per l'iframe con i tag del frameset (con le opportune modifiche: src="'+pagina+'" nel frame del contenuto)
L'esempio completo in zip è disponibile per il download sul sito in firma, seguendo RISORSE > GLI SCRIPT CHE HO USATO, alla voce RICOSTRUIRE IL LAYOUT
------------------------------
L'utilizzo di questo script presenta anche altre due caratteristiche, che possono essere vantaggi o svantaggi a seconda dei punti di vista:
1) L'url visualizzato richiamando solo la index sarà sempre e comunque www.nomesito.it o nomesito.it/index.htm(php)
A meno che non venga richiamata una pagina esterna, nel caso sarà: http://www.sito.it/index.htm?http://....it/pagina.htm
e tale rimarrà anche nel caso si cambi pagina caricata nel frameset. Se qualcuno ha qualche idea per evitarlo, ben venga, io adesso non ho tempo di lavorarci
2) da ciò deriva che il codice visualizzato (tramite menu VISUALIZZA > HTML del browser) sarà sempre e comunque quello della index.
Spero di essere stato utile!
Keywords: layout, ricostruire, richiamare, menu, frameset, iframe, struttura, javascript