Newsgroup: it.comp.lang.javascript
Titolo: Image.height in Netscape

Salve a tutti,
scusate se per caso è già stata fatta questa domanda, ma mi sto incavolando
con uno script che non mi funziona e non ne vengo più fuori!
Dopo vari tentativi ho capito che il problema è nella parte che recupera
l'altezza di una immagine nella pagina.
L'immagine (imgS) è dentro un layer (Layer1) e questa è la riga che mette
nella variabile img_height l'altezza di imgS:
img_height = document.imgS.height
In IE mi funziona bene, ma in Netscape no!
Ho provato anche così (solo x netscape):
img_height = document.imgS.height.value
o
img_height = document.layer.imgS.height.value  (a caso proprio)
ma senza risultati positivi.
Come posso fare ? Conoscete la sintassi corretta ?
Grazie 1000 in anticipo x le risposte...
--
*®*´¯`·.¸¸.·´¯`·.¸¸.·´¯`·--=/- Darcan -\=--·´¯`·.¸¸.·´¯`·.¸¸.·´¯`*®*

 con uno script che non mi funziona e non ne vengo più fuori!
Eh, quanto ti capisco...ieri sera 4 ore su un sito che non mi funziona con
netscape...dopo 4 ore solo al punto iniziale: non capisco il perché...sembra
in alcuni casi non considerare lo style:display ma non capisco con che
logica...mah...
Ti risponderà qualcuno che ne sa più di me; io proverei con
var img=new Image();img.src='tuaimmagine.gif';alert(img.height);
prova a vedere se così funziona

 Come posso fare ? Conoscete la sintassi corretta ?
document.layers["Layer1"].images["imgS"].height;
Prova cosi'. Ovviamente l'immagine deve essere gia' stata caricata,
altrimenti il browser non puo' saperne l'altezza.
Per quanto riguarda la sintassi, il problema tuo e' che stava in un layer.
Per NS4.x infatti, ogni layer e' un document a parte. Questo significa che,
mentre per IE>=4, NN>=6, la collection/array "document.images" contiene
TUTTE le immagini presenti nella pagina, su NS4.x document.images contiene
SOLO le immagini presenti nel "primo livello" della pagina, e non quelle
presenti anche nei layers.
Per recuperare la collection di un dato layer, devi usare, appunto, la
sintassi di cui prima.
--------------------------------
Inviato via 
http://usenet.libero.it

 presenti anche nei layers.
Grazie, era proprio questo il problema...
Se mi potete aiutare anche per il 6 ve ne sarei molto grato...


 Se mi potete aiutare anche per il 6 ve ne sarei molto grato...
Il codice che segue l'ho provato su IE6 e Moz 1.1 quindi dovrebbe andare 
anche con N6.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
	<TITLE>Untitled</TITLE>
<SCRIPT>
<!--
function alte()
	{
	window.status=document.images.prova.height+" - 
"+document.images.prova.width;
	}
onload=alte;
//-->
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#ffffff">
<div id="livello" style="top:30px;left:50px;position:absolute;border : 2px 
dashed red">
   <IMG SRC="pageviews.gif" ALT="" NAME="prova" ID="p" WIDTH="609" 
HEIGHT="331" BORDER="0">
</div>
</BODY>
</HTML>
-- 
Ciao, Riccardo
------------------------------------------------------------------------
http://www.jsdir.com
 ---- Bring Your Site To Life!!!!
------------------------------------------------------------------------
http://www.dev2dev.it
 - La rete ha connesso nuove particelle - D2D006
------------------------------------------------------------------------
 ----> itALY = it <----

 anche con N6.
Sì, anche il mio codice funziona:
    if (img_height != 0) {img_height =
document.getElementById("imgS").height}
    o
    if (img_height != 0) {img_height = document.images["imgS"].height}
...ma solo la prima volta (cioé quando apro il browser e carico la
pagina)...
Se la ricarico non funziona più (mi da sempre altezza 0)...
E oltretutto non funziona proprio benissimo, perché il layer non sparisce
completamente, ma spariscono un pezzo superiore ed un pezzo inferiore...
?!?
Secondo me Netscape 6 ha qualcosa che non va con i layer... e per te ?
Ciao e grazie


 Secondo me Netscape 6 ha qualcosa che non va con i layer... e per te ?
Secondo me in N6 i "layer" non esistono piu', esistono i DIV, il DOM2 ed i 
CSS.
E sono quanto di meglio si possa desiderare.
Comunque se posti un po' di codice forse riusciamo a vedere meglio dov'č il 
problema, i poteri para(A)normali che io sappia ce li ha solo otelma! :-))


 problema, i poteri para(A)normali che io sappia ce li ha solo otelma! :-))
Beh, penso neanche lui, comunque ecco il codice: praticamente io ho nella
pagina molte immagini piccole, e quando ci passo sopra col mouse voglio che
sia apra il layer con una tabella in cui c'è l'immagine un po' più grande
con la didascalia sotto. Attenzione però che ho fatto in modo che il layer
fosse sempre vicino alla destra del mouse, e che non andasse mai fuori
pagina....
Gli argomenti della funzione sono il numero della foto relativa al link, se
l'immagine c'è (perché potrebbe esserci solo la didascalia), e "e" è
l'evento che viene passato per andare bene con le funzioni delle coordinate
del mouse in netscape (ho visto che funziona)...
Poi troverete anche un did[num_foto], che praticamente è l'array delle
didascalie che prendo da un file .js (ma quello funziona bene)...
// CODICE //
function mostra_foto(num_foto, image, e){
  // controlla se c'è o non c'è l'immagine nel layer
  immagine = '';
  img_height = 0;
  if(image==1){immagine = '<img name="imgS" id="imgS"
src="foto/Image'+num_foto+'.jpg"><br>'; img_height = 1;}
  // imposta il contenuto del layer
  MM_setTextOfLayer('Layer1','','<table border="1" cellspacing="0"
bordercolor="#CCCCCC" bgcolor="#FFFFFF"><tr><td
align="center">'+immagine+'<font size="1" face="Verdana, Arial, Helvetica,
sans-serif">'+did[num_foto]+'</font></td></tr></table>');
  ns4 = (document.layers)? true:false;
  ie = (document.all)? true:false;
  ns6 = (document.getElementById)? true:false;
  if(ie){ // Internet Explorer
    if (img_height != 0) {img_height = document.images["imgS"].height}
    top_page = document.body.scrollTop;
 bottom_page = document.body.clientHeight+document.body.scrollTop;
  } else if(ns4) { //Netscape 4
    if (img_height != 0) {img_height =
document.layers["Layer1"].document.images["imgS"].height}
    top_page = window.pageYOffset;
 bottom_page = window.innerHeight+window.pageYOffset;
  } else if(ns6) { //Netscape 6
    //  QUESTA E' LA PARTE INCRIMINATA
    //if (img_height != 0) {img_height =
document.getElementById("imgS").height}
    if (img_height != 0) {img_height = document.images["imgS"].height}
    top_page = window.pageYOffset;
 bottom_page = window.innerHeight+window.pageYOffset;
  }
  top_layer = top_page+mouse_y(e);
  if (img_height != 0) { top_layer = top_layer-Math.round(img_height/2) }
  bottom_layer = top_layer+img_height+60;
  if(bottom_layer > bottom_page) { top_layer = bottom_page-(img_height+60) }
  if(top_layer < top_page+40) { top_layer = top_page+40}
  if (ie) {
    document.all.Layer1.style.top = top_layer;
    document.all.Layer1.style.left = mouse_x(e)+20;
  } else if (ns4) {
    document.layers.Layer1.top = top_layer;
    document.layers.Layer1.left = mouse_x(e)+20;
  } else if(ns6) {
    document.getElementById("Layer1").style.top = top_layer;
    document.getElementById("Layer1").style.left = mouse_x(e)+20;
  }
  // mostra il layer
  MM_showHideLayers('Layer1','','show');
}
// FINE CODICE //
Comunque il problema è solo con Netscape 6, per il fatto che il layer non
scompare del tutto e ho visto che se ricarico la pagina mi da l'altezza
dell'immagine (img_height) sempre = 0 !
Ciao e grazie dell'aiuto


 Beh, penso neanche lui, comunque ecco il codice: 
Formalmente e' esatto.
Probabilmente c'e' qualcosa che non va nella funzione di Dreamweaver con cui 
scrivi il codice nel livello, intanto ho scoperto una cosa: anche in locale 
Mozilla 1.1 non riesce a leggere istantaneamente le caratteristiche 
dell'immagine, ha bisogno di un timeout di anche un solo millisecondo.
Probabilmente IE e N4 aspettano il caricamento prima di continuare lo script 
mentre Moz non lo fa.
Prova questo:
<HTML>
<HEAD>
	<TITLE>Untitled</TITLE>
<SCRIPT>
<!--
function parti()
	{
	setTimeout("scrivi()",2000);
	}
 
function scrivi()
	{
	document.getElementById("livello").innerHTML='<IMG 
SRC="pageviews.gif" NAME="imgS" ID="imgS">';
//leggi();
	setTimeout("leggi()",1);
	}
function leggi()
	{
	l=document.images["imgS"].width;
	a=document.images["imgS"].height;
	alert("larghezza: "+l+" \naltezza: "+a);
	}
 
onload=parti;
//-->
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#ffffff">
<div id="livello" style="top:30px;left:50px;position:absolute;border : 2px 
dashed red">
Livello vuoto inizialmente<BR>
Ora carico l'immagine e poi scrivo le dimensioni...
</div>
</BODY>
</HTML>
Se commenti il timeout nella funzine scrivi() e fai eseguire istantaneamente 
la leggi() Moz restituisce 0,0 mentre IE restituisce le dimensioni corrette.
Se invece lasci il timeout anche Moz funziona bene.
Ovviamente la prova l'ho fatta in locale quindi magari quando vai on-line 
devi dargli un po' piu' di tempo.
Altrimenti spezza lo script. Assegna l'immagine ad un oggetto Image ed 
aspetta l'onLoad() per continuare.
La stessa tecnica che vedi nel primo script di questa pagina: 
http://www.jsdir.com/staffscripts


 aspetta l'onLoad() per continuare.
Questo non l'ho capito molto, comunque ti volevo chiedere: c'è un modo per
visualizzare la pagina solo dopo che il client l'ha caricata tutta ?
Grazie 1000 per tutto il tempo che perdi a causa mia... ;)


 visualizzare la pagina solo dopo che il client l'ha caricata tutta ?
Guardati lo script che ti ho segnalato, quello della password verificata.


 Guardati lo script che ti ho segnalato, quello della password verificata.
Il problema più che altro è che dovrei aspettare che l'immagine sia caricata
nel layer (anche se questo non è visibile), e non che la pagina sia
caricata...
Dico anche se il layer non è visibile perché io prima imposto il contenuto
del layer, poi lo sposto a seconda della posizione del link e la grandezza
dell'immagine, e poi lo visualizzo: ho notato che in Netscape6 quando lo
visualizzo l'immagine compare dopo un po', e probabilmente è questo il
problema...
Ciao e grazie !


ci vorrebbero tutti i TUOI codici INCLUSO l'html.
A me comunque non dà alcun tipo di errore, legge tutto anche se
ricarico:
<BODY
<div style="position:absolute;top:30;left:50;">
<img src="foo.gif" width="100" height="200" id="imm" >
</div>
<SCRIPT>
<!--
alert(document.getElementById("imm").height)
//-->
</SCRIPT>
</BODY>
Naturalmente puo leggere una immagine indirizzandola solo DOPO che la
hai caricata: non necessariamente on load, basta
che la chiamata sia dopo il tag d'immagine.
ciao
Alberto
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG