Newsgroup: it.comp.lang.javascript
Titolo: [LONG] [HELP] Dhtml + Compatibilità

salve a tutti,
sto preparando uno script per risolvere un problema in alcune pagine, 
dove
la presenza di contenuti troppo lunghi costringerebbe il visitatore a
scrollare per km l'intera pagina.
L'idea è quella di disporre i contenuti su più layer e, con una serie di
link testuali collegati ad apposita funzione, tipo:
1 | 2 | 3 | 4 ...
permettere di "sfogliare" i contenuti della pagina, aprendo e chiudendo i
layer corrispondenti.
Ho anche la necessità di posizionare in maniera precisa questi layer, e 
dato
che il layout della pagina è centrato, ho fatto una funzioncina ad hoc 
che
posiziona il layer a seconda delle dimensioni della finestra del browser.
Ho quindi pensato: dato che il primo <DIV> mi serve a creare l'altezza 
necessaria alla pagina per il corretto posizionamento del footer, lo 
tengo a posizionamento "relativo", mentre posizionerò gli altri in 
maniera assoluta, a seconda della dimensione della finestra, in modo che 
ricadano nel layout.
Il tutto, considerando che NE e IE gestiscono in modo diverso sia la 
funzione che restituisce le dimensioni della finestra, sia i layer, 
quindi ci saranno delle parti condizionali.
semplice, no ? 
allora, ho fatto così:
==========
function movelayer(gruppo,totale){
 //se netscape
 
 if(navigator.appName == "Netscape") {
 pag = "document.layers"; 
 stile = "";
 screenx = window.InnerWidth;
 if(screenx<753) screenx=753;
 
}
 else {
 pag = "document.all";
 stile = ".style";
 
 screenx = document.body.clientWidth;
 if(screenx<753) screenx=753;
}
 
 //correggile in base alle dimensioni della finestra
  layerleft = 458+(.5*(parseInt(screenx)-753))+'px';
 
 //propagale ai rimanenti layer
 
 for (var i=2; i <= totale; i++) {
  layerObj=eval(pag + '["'+gruppo+i+'"]' + stile);
//  layerObj.top = layertop;
  layerObj.left = layerleft ;
 }
 
// document.write(layerleft)
 
// fine funzione 
}
==========
...dopo di ché, i layer si chiamano "cont1", "cont2", eccetera. 
Allora: 
IE6: funziona tutto
IE5: funziona tutto
NS6: non funziona niente: document.layers has no properties
NS4.7: crash immediato ed irrecuperabile.
idee ? l'unica cosa che mi viene in mente è che la parte condizionale è 
"antiquata": come potrei migliorarla ? Non ho soluzioni invece per il 
fatto che NS 4.7 si PIANTI. Non mi era mai successo di far piantare un 
browser con un javascript :-(
QQG

 NS4.7: crash immediato ed irrecuperabile.
Va visto nel dettaglio. Personalmente non utilizzerei cmq un codice del
genere.
Quando si parla di layers, poi, controlla innanzitutto se hai usato fogli di
stili. Spesso i crash di NS4 nascono dall'uso di DHTML con certe
impostazioni nei CSS..
Ricordati il resize, poi..
--------------------------------
Inviato via 
http://usenet.libero.it

   layerObj=eval(pag + '["'+gruppo+i+'"]' + stile);
L'approccio con eval() ti incasina la vita perche' con Mozilla/N6+ devi usare 
getElementById("nomelayer") invece di layers.
Vedi questo codice:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
	<TITLE>Untitled</TITLE>
<SCRIPT>
<!--
var brN4=document.layers?true:false;
var brIE=document.all?true:false;
var brMz=document.getElementById?true:false;
function movelayer(gruppo,totale)
	{
	 // Rileva dim content-area
 	if (brN4||brMz)
		var scrx = window.innerWidth;
	if (brIE)
		var srcx = document.body.clientWidth;
	// Corregge dimensioni content-area
	srcx=srcx<=753?753:srcx;
	//correggile in base alle dimensioni della finestra
	layerleft = parseInt(458+(srcx-753)/2);
	// Sposta layers
 	for (var i=2; i <= totale; i++)
		{
		layerObj=brN4?document.layers["l"+gruppo+i]:brIE?document.all["
l"+gruppo+i].style:document.getElementById("l"+gruppo+i).style;
		//  layerObj.top = layertop;
		layerObj.left = layerleft ;
		 }
 	// document.write(layerleft)
 	// fine funzione 
	}
//-->
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#ffffff" onLoad="movelayer('cont',5)">
<DIV ID="lcont1" 
STYLE="position:absolute;left:100;top:100;width:400;background-
color:red;border:none;">Layer numero 1</DIV>
<DIV ID="lcont2" 
STYLE="position:absolute;left:100;top:100;width:400;background-
color:red;border:none;">Layer numero 2</DIV>
<DIV ID="lcont3" 
STYLE="position:absolute;left:100;top:100;width:400;background-
color:red;border:none;">Layer numero 3</DIV>
<DIV ID="lcont4" 
STYLE="position:absolute;left:100;top:100;width:400;background-
color:red;border:none;">Layer numero 4</DIV>
<DIV ID="lcont5" 
STYLE="position:absolute;left:100;top:100;width:400;background-
color:red;border:none;">Layer numero 5</DIV>
</BODY>
</HTML>
[---> Attenzione alle righe lunghe <---]
Io ho considerato che la funzione scatti all'onLoad della pagina, se qualcosa 
per te è diverso non mi rimane che risponderti: dipende! :-))
Inoltre non ho capito come valorizzi layerleft, la formula che ho usato io e' 
equivalente alla tua, ma l'angolo top-left dei livelli va al centro, non va 
al centro il centro dei livelli, insomma... hai capito: dipende! :-))
-- 
Ciao, Riccardo
------------------------------------------------------------------------
http://www.jsdir.com
 ---- Bring Your Site To Life!!!!
------------------------------------------------------------------------
http://www.dev2dev.it
 - La rete ha connesso nuove particelle - D2D006
------------------------------------------------------------------------
 ----> itALY = it <----

 (f-up su it.comp.lang.javascript)
Infatti ti ho risposto li, mi sembrava piu' appropriato :-)


 var srcx = document.body.clientWidth;
Homo distractus!
Qui funziona tutto, grazie all'assenza di un else o di altre funzioni, ma
ogni IE5+ avra' brMz==true.

, 
ascartab...@codice.it
 says...

Homo dimenticantibus: IE5 supporta il DOM2 se non sbaglio, quindi eseguira' 
il "suo codice" o il "nuovo" indifferentemente.
Qui srcx viene valorizzato due volte e resta fissato dalla seconda 
assegnazione, nella riga del layerObj=... brIE e' nell'else di brN4 e dato 
che e' true esegue document.all... ma anche il getElementById non gli 
farebbe schifo.
Di fatto invece e' importante che sia eseguito il codice di IE (e' questo 
e' certo per come funziona ?: ) per compatibilita' con IE4.
... dopotutto una delle poche certezze che ho e' che IE non perdera' mai la 
compatibilita' all'indietro, penso al DOS... se tanto mi da tanto... :-)
Piuttosto un errore l'ho commesso :-) anche se corretto inavvertitamente in 
seguito dall'algoritmo originale di QQG ^_^


 seguito dall'algoritmo originale di QQG ^_^
QQG?

 QQG?
quiqueg, l'autore del post.
Si firma cosi' in it.lavoro.professioni.webmaster e mi e' venuto spontaneo.


 
muà, in breve :-)
dario

grazie a tuttti, veramente gentilissimi e istruttivi... 
se posso ricambiare con una qualunque domanda in ambito grafico (che è il 
mio), non esitate :-)
a buon rendere,
dario

, 
qui...@freemail.it
 says...

Ola!
Todo occhei? Todo claro?


 a buon rendere,
No problem! :-)


 Si firma cosi' in it.lavoro.professioni.webmaster e mi e' venuto
spontaneo.
Ok, tirate le fila. Mi ero immaginato qualcosa tipo "QusQusGlan"...

 Ok, tirate le fila. Mi ero immaginato qualcosa tipo "QusQusGlan"...
Mah, io la prima volta che l'ho letto ho pensato QuiQuoGua :-)
Dariooooooo che cacchio significa QQG/quiqueg?



io lo so io lo so :-)
e'  l' arpionatore tatuato in   Moby Dick di Melvģilllle
ho vinto qualche cosa?
[chiamatemi Ismaele]

 
stasera ci metto mano, ma direi di si, poi al limite er pupo lo svezzo da 
me, sono - si - grafico, ma imparo alla svelta :-)
ciao,
d.

 ho vinto qualche cosa?
potrei dire "un arpione", ma non mi sembrava carino :)
QQG

potrei dire "un arpione", ma non mi sembrava carino :)
me la sono cercata ;-)
[non chiamatemi piu' Ismaele]

 Qualcosa on-line?
per ora solo lavori fatti per altri: tutta 'sta robba mi serve per fare il 
"mio" (nostro) sito: la pubblicità è l'anima del commercio :-)
ciao, 
QQG

 salve a tutti,
approposito... sto finalmente implementando tutto quanto detto sopra... 
netscape 4 resterà tagliato fuori da alcune finezze, ma tant'e'.
invece, il fottuto OPERA, come si comporta ? da alcune fonti ,
p.es
. 
http://www.xs4all.nl/~ppk/js/browsers4.html#op6
vedo che dovrebbe supportare sia DOM1 (Op5 solo DOM1) che document.all, 
ma... nisba.
boh.
QQG/a volte penso che il monopolio in fatto di browser sarebbe una buona 
cosa.

 ma... nisba.
Appunto!


 Per me OPERA non esiste quando faccio DHTML/JavaScript.
se lo dici tu, sono tranquillo ;-)
ciao,
QQG