Newsgroup: it.comp.lang.javascript
Titolo: Aiutino con script per visualizzare nascondere un div

ciao a tutti
ho questa function che mi permette cliccando su un link di far
visualizzare/chiudere un div.
function showhide(id)
{
if (document.getElementById)
 {
  obj = document.getElementById(id);
   if (obj.style.display == "none")
    {
     obj.style.display = "block";
    }
   else
    {
     obj.style.display = "none";
    }
  }
}
Ho due richieste...
1) la pagina dove è inserito scrolla e succede che cliccando su uno
dei link in fondo alla pagina, mi riporta in alto, vorrei invece che
dopo aver nascosto o visualizzato il div rimanga nella stessa posizione
2) con questo script posso aprire e chiudere indiferentemente da quanti
sono aperti/chiusi vorrei invece che se ne aprisse solo uno alla volta.
Ho provato a cercare altri script o sono troppo incasinati o non
funzionano, questo funziona ma vorrei riuscire a fargli fare quello che
ho scritto sopra :-)
Ciao ciao a tutti e grazie

 uno solo *cosa*? Di che? Per "aperto" intendi non nascosto?
Credo che lui abbia un certo numero di div e voglia che uno solo per volta
sia visibile; in questo caso, ogni volta che un div viene reso visibile
occorre rendere invisibili tutti gli altri.
Cosi', giusto per intromettemri un po' :)
-- 
~Nando~ :-/__.oO
Apostolo della Prova

intendevo che ho diversi div e vorrei che solo uno alla volta fosse
visibile.

ogni div ha il suo id ...

progressivo che parte da 0 o da 1.
direi che è proprio come dici tu, tutti i miei div si chiamano
testo1,testo2,testo"n"...
altra cosa ho provato ad usare la tua function
function showhide(i) {
  if ((document.getElementById) && (document.getElementById(i))) {
    var obj = document.getElementById(i);
    obj.style.display = obj.style.display == 'none' ? 'block' : 'none';
  }
}
ma mi da errori...
comunque nella mia ho cambiato id con i come hai consigliato tu.

 ma mi da errori...
Eh, interessante...che errori? La function sopra mi sembra corretta. A
naso, quindi, stai indicando un "i" (che dovrebbe essere l'id dell'oggetto)
non valido.
Sarebbe però appunto interessante cosa significa "ma mi da errori", vedi
nella javascript console cosa ti dice.
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

>Eh, interessante...che errori?
riga 192 dove ho il seguente codice
<a href="#" onclick="showhide('testo1');" class="text_2_black">
leggi maggiori info
</a>
carattere: 1
errore: previsto oggetto
codice: 0

 codice: 0
Stai usando IE? Usa Firefox o browser Gecko based per lo sviluppo, la loro
js console è più esaustiva.
-- 
~ "Nell'anno 1969 è bastata la potenza di calcolo di due Commodore 64 per
mandare con successo una navicella sulla Luna. Nell'anno 2003 è
necessario un Pentium 4 a 2000 Mhz per far funzionare Windows XP.
Qualcosa deve essere andato storto."

penso di aver capito...
sono un asino!!!
ho copiato per ben due volte la function scritta da "Sembro la carta" e
non copiava l'ultima parentesi chiusa!
funziona funziona!
mi resta da risolvere il discorso di visualizzare un solo div alla volta

 mi resta da risolvere il discorso di visualizzare un solo div alla volta
function showHideTesto(n) {
  if (!(document.getElementById)) return void(0);
  var o;
  n = parseInt(n);
  // quello che segue tutto su una riga, fino al ";"
  for (var i=1; (document.getElementById('testo'+i)); i++)
document.getElementById('testo'+i).style.display = i != n ? 'none' : (
document.getElementById('testo'+i).style.display == 'none' ? 'block' :
'none' );
}
La richiami con << onclick="showHideTesto(1)" >>
Indipendentemente dal fatto che stia nascondendo o mostrando un certo
div nasconde in ogni caso tutti gli altri.
Richiede che i div il cui nome e` "testoN" esistano tutti con N intero
da 1 in poi. Si ferma quando trova un div che non esiste, quindi niente
/buchi/ nella numerazione.
-- 
Splendente in eta` acerba di passione
rosso fiammante,
ma senza eta` matura
marcia impostura

 'none' );
E questa non la capisco bene, soprattutto l' = 1 != n (non ci va == ?)
Vabbé, il Lunedì mattina è così...
-- 
"Ho smesso di fumare.
 Vivrò una settimana di più.
 E in quella settimana pioverà a dirotto"
									    W.A.

 Vabbé, il Lunedě mattina č cosě...
Dice: se l'elemento corrente nel ciclo NON e' quello che deve essere
visualizzato/nascosto, allora nascondilo, altrimenti, se e' l'elemento su
cui si deve agire, nascondilo se e' visualizzato o viceversa.
Vedi se scritta cosi' e' piu' chiaro:
document.getElementById('testo'+i).style.display = (
(i != n) ? 'none' : 
(document.getElementById('testo'+i).style.display == 'none' ? 'block' :
'none' ));
Ma comunque mi chiedo... non si potrebbe usare una variabile globale,
diciamo currentDiv, alla quale assegnare l'ID del div attualmente visibile
(null se sono tutti nascosti) e nascondere solo quello?


 (null se sono tutti nascosti) e nascondere solo quello?
Sì, io solitamente uso questa strada per evitare di ciclare tutti i
controlli.
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 controlli.
Ah, ok, non sono *totalmente* fesso.


 :-) io stamane mi sento in forma, invece!
:-) che uno si senta in forma il lunedě IMHO č quasi preoccupante, se a me
dovesse mai succedere una volta andrei dal medico a chiedere spiegazioni!!!
:-)
 
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 quindi non trova l'oggetto? logico e carino.
Non ti ricordi che era lo stesso approccio da me usato sulla classe per la
gestione degli stylesheet, e che a te non piaceva per nulla? :)
Non era un "for" ma un "while", ma il concetto era il medesimo.
-- 
~ "Nell'anno 1969 č bastata la potenza di calcolo di due Commodore 64 per
mandare con successo una navicella sulla Luna. Nell'anno 2003 č


 (null se sono tutti nascosti) e nascondere solo quello?
Meglio ancora: in tale variabile tenere il riferimento all'elemento stesso,
e non al suo ID.
Se si tratta di una pagina web che non ha troppe complicazioni, come
approccio può andar bene quello di tenere questa variabile come globale.
Per web application, invece, sarebbe più opportuno evitare di
"sparpagliare" variabili globali di questo tipo "a giro", per una semplice
questione di buona programmazione, in un ottica di manutenzione /
riusabilità; ed eventualmente realizzare un oggetto che si preoccupi di
gestire questo genere di cose.
Nota:
Nella programmazione a oggetti "canonica", viene usato il design patter
singleton, per ridurre l'uso di variabili globali.


 singleton, per ridurre l'uso di variabili globali.
Ecco, qui mi sono perso :)
Sono un niubbo, mi diverto ma non sono nel mio elemento, qui!
Mo' googlo, va'...


 gestione degli stylesheet, e che a te non piaceva per nulla? :)
:-O no...magari non lo avevo ben capito, a me piacciono questi bei
costrutti compatti solitamente. 
Ma, mi sembra di ricordare, la tua dava qualche problema se si aggiungevano
style all'inizio o alla fine o...boh, ricordo qualcosa del genere, una
discussione sul collega che gestisce i css e...boh. Questa invece se non
trova esce e bon.


 Ecco, qui mi sono perso :)
 
http://dhtmlkitchen.com/learn/js/singleton/
mi ero salvato questo che spiega passopasso (anche se č c#):
 
http://www.yoda.arachsys.com/csharp/singleton.html
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturitą"
									    F.G.

 trova esce e bon.
Nono, l'approccio era esattamente il medesimo. Se non trovava l'elemento,
"usciva e bon" (in quanto se l'elemento era null, veniva considerata false
come valutazione dell'espressione di ciclo).


 tipo di approccio...
:-O :-O Forse era quel periodaccio prima delle ferie (che non ho fatto)?
Magari semplicemente la avevo letta di corsa e non ben compresa.
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

  
http://www.yoda.arachsys.com/csharp/singleton.html
Si'... google m'era stato d'aiuto.
Anche se non ho ben capito il nesso tra il singleton e il problema di un
unico div visibile...


 possibili div da nascondere,
Qui ti stai confondendo. L'avrebbe evitata, invece.
Ti illustro un'ipotetico scenario e relativo workflow: tutti i div sono
nascosti, la variabile globale è settata a null.
L'utente clicca per rendere visibile il div relativo. Viene effettuato un
controllo sul fatto che la variabile globale sia diversa da null e
dall'elemento cliccato. In tal caso, nasconde l'elemento a cui fa
riferimento e rende visibile l'elemento selezionato dall'utente. Poi,
assegna alla variabile globale il riferimento all'elemento appena cliccato.
Come vedi, non vi sono cicli da fare.
Nota:
Eventualmente si potrebbe modificare il comportamento in modo che, se
l'elemento cliccato corrisponde al riferimento salvato nella variabile
globale, l'elemento venga "nascosto" e la variabile impostata a null.


 nascondendo il div gia` attivo. Alla fine le operazioni sono le stesse.
E questo non lo capisco.
Cioe', si parte con tutti i div nascosti e la variabile, chiamiamola
activeDiv, con valore *null*. Nel momento in cui viene attivata la funzione
di visualizzazione/nascondimento del div con id divId, basta nascondere il
div activeDiv (a meno che non sia *null*), quindi mostrare (ovvero
nascondere) il div divId e porre activeDiv=divId (ovvero activeDiv=null).
No?


 Mo' googlo, va'...
Bravo. I design pattern sono una di quelle cose di cui, almeno, è bene
saperne quantomeno l'esistenza. Anche senza usarli, possono essere di
notevole spunto e interesse per il tipo di approcci logici usati.


  
http://dhtmlkitchen.com/learn/js/singleton/
Mi pare che questo fosse il link postato da Daniele, ma non vorrei
sbagliarmi, e che non mi trovava molto d'accordo sull'approccio usato per
implementare il singleton in js.
-- 
~ "Nell'anno 1969 č bastata la potenza di calcolo di due Commodore 64 per
mandare con successo una navicella sulla Luna. Nell'anno 2003 č


 il perche'?
Se c'e' un perche' oltre alla buona programmazione, in un'ottica di
manutenzione e riusabilita' (cit.) :)


 unico div visibile...
Se rileggi il mio post, noterai come ho chiaramente scritto che il
singleton è l'approccio usato per ridurre l'uso delle variabili globali.
Non era legato direttamente alla gestione dell'unico div visibile.
Lo era in modo indiretto, e solo nel momento in cui la metodologia usata
per realizzare un solo div visibile faceva uso di una variabile globale; in
particolar modo in web application.


 notevole spunto e interesse per il tipo di approcci logici usati.
Si', ho una vaghissima idea di cosa siano i design pattern... e poi oggi
sono in fase cazzeggio costruttivo :)


 manutenzione e riusabilita' (cit.) :)
Frase che, nel campo informatico, viene spesso contratta semplicemente in
"best practices".
Le variabili globali andrebbero usate con parsimonia in quanto il loro
scope è pari a quello applicativo. Restano a occupare memoria anche se non
ne fai costantemente uso. Ed avendo scope globale, aumenti il rischio di
bug. Inoltre, come già scritto, ti rendono difficile la manutenzione e
l'integrazione successiva del software di nuove features; per non parlare
se tale integrazione deve essere fatta da terzi e non da chi ha scritto il
sorgente originale; o anche se vi si lavora a più mani.
Già di per sé quest'ultimo motivo basterebbe per evitare le variabili
globali laddove non indispensabili. Soprattutto per applicazioni web based.


 sono in fase cazzeggio costruttivo :)
Conosco bene la sensazione.


 globali laddove non indispensabili. Soprattutto per applicazioni web based.
Ho continuato a googlare... questo mi sembra descrivere bene la situazione:
***
Globals are hated and feared because they create hidden and problematic
dependencies in your code.  You have this nice function you want to reuse
and
discover "oh, I need THIS_VARIABLE" and things start to go bad.
***


 particolar modo in web application.
Cioe', invece di una variabile usare una classe che possa essere istanziata
una sola volta? Aiut...
Vabbe', mi fermo qui: e' troppo per me (e per la mia pigrizia). In fondo mi
occupo solo di note (non in senso ironico).


 occupo solo di note (non in senso ironico).
Allora sei un "collega" del buon Catarsi, in un certo senso. :)


 giusto.
Un "effetto collaterale" di questo approccio, a livello generico intendo
(dato che può essere usato in un centinaio di modi diversi), è avere un
costante riferimento all'elemento "corrente", e può quindi risultare utile
nel momento in cui si deve selezionare qualcosa per poi operare sullo
stesso. Come, ad esempio, selezionare l'elemento di un albero per decidere
a quale "livello" aggiungere dei nodi figli, e cose del genere.


 o in un oggetto del DOM. 
Ecco, questa non è esattamente una "best practices".
Comunque, come ho scritto in un altro post, tutto dipende essenzialmente
dal contesto.
Generalmente, tendo ad evitare l'uso di variabili globali impostando tutto
il sistema in ottica OOP. Ma non va vista questa come una regola ferrea, ma
flessibile al contesto.


 (che gia` ora hanno un naming schema forzato, e quindi dei vincoli)
Usando un riferimento a l'oggetto attualmente selezionato (che, ti ricordo,
può essere una "variabile globale" come no, se si implementa in ottica OOP)
puoi anche fare a meno del "naming schema forzato".


 puoi anche fare a meno del "naming schema forzato".
E' un termine complicato per dire che i div avevano tutti nomi con un
medesimo schema (testo1, testo2... testoN) oppure e' altro?
Grassie :)


function showHideTesto(n) {
  if (!(document.getElementById)) return void(0);
  var o;
  n = parseInt(n);
  // quello che segue tutto su una riga, fino al ";"
  for (var i=1; (document.getElementById('test­o'+i)); i++)
document.getElementById('testo­'+i).style.display = i == n ? 'none' :
(
document.getElementById('testo­'+i).style.display == 'none' ? 'block'
:
'none' );
ho provato ad inserirla nella mia pagina, clicco e mi si aprono tutte
tranne quella su cui ho cliccato,
ci riclicco e le chiude tutte , se clicco su un'altra mi apre l'ultima
cliccata dato che era non visibile...
a parte la riga di codice del for non capisco quel var o; a cosa
serva???!
ciao e grazie
}

quella del trattino ho visto e non so comunque l'ho tolto dato che i
miei div si chiamano testo"n"
se guardi hai postato due script e uno ha == e subito dopo i!=n     8-)
e io ho copiato il primo :-))))

 P.S.: con tempi /biblici/ "qualcuno" si sta risvegliando... Stay tuned.
Eh?
P.S.
Ho una mezza idea di comprare un iBook 12", anche se non so "in che tempi".
E' probabile che ti chiederò qualcosa - o passerò dal NG relativo -
soprattutto in vista del cambiamento di microprocessore che sta per attuare
la Apple. Vorrei capirci qualcosa di più.


 Grassie :)
Preghen.
-- 
~ "Nell'anno 1969 č bastata la potenza di calcolo di due Commodore 64 per
mandare con successo una navicella sulla Luna. Nell'anno 2003 č


 cambiero` (tra almeno un paio di anni) la nuova serie sara` a posto.
Il che potrebbe avere senso anche per me. Solo che per uno che proviene da
anni di piattaforma wintel, potrebbe essere utile aspettare il passaggio al
nuovo microprocessore; soprattutto per quanto riguarda lo sviluppo software
a basso livello. Boh, non so. Questo è fondamentalmente l'unico dubbio che
ho.


 per cosa? :-)
Per la programmazione a basso livello. Sono cresciuto sviluppando su
processore intel.


 A meno che tu non scenda a livello assembler non vedo il problema...
E' da una vita che non sviluppo più solo in assembler, ma talvolta scrivo
codice assembly in sorgenti C; soprattutto se ho bisogno di "spingere" un
po' di più.
Sarebbe semplicemente stato comodo ritrovarsi sotto lo stesso processore al
quale sono abituato; anche se in verità l'iBook non lo prenderei proprio
come "computer da sviluppo" (tranne che per tre cazzatine web, al limite),
ma come "computer da usare".
Però si dice mai che mi venga voglia di farci qualcosa anche lì. :)


 fuori garanzia... ho sempre fatto tutto da solo :-)
Uhm, capito. :)
