Riprendiamo l'esempio della lezione precedente: potremmo voler far sì che il nostro lavoro non vada buttato, ma che sia riutilizzabile, indipendentemente dal livello. Con un minimo sforzo in più è possibile passare un argomento alle funzioni, in modo da renderla generica. Ecco l'esempio completo:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<style type="text/css">
#mioLiv {
position:absolute;
background-color:orange;
width:300px;
height:20px;
border:1px;
visibility:show;
}
</style>
<script type="text/javaScript">
function inizializza(){
if (document.all) {
documento="document.all";
parA="["";
parB=""]";
visibilita=".style.visibility";
nascosto=""hidden"";
visibile=""visible"";
}
else if (document.layers){
documento="document.layers";
parA="["";
parB=""]";
visibilita=".visibility";
nascosto=""hide"";
visibile=""show"";
}
else if (document.getElementById) {
documento="document.getElementById";
parA="("";
parB="")";
visibilita=".style.visibility";
nascosto=""hidden"";
visibile=""visible"";
}
}
function nascondi(livello) {
eval(documento+parA+livello+parB+visibilita+"="+nascosto+";");
}
//la funzione è dichiarata con l'argomento "livello"
function mostra(livello) {
eval(documento+parA+livello+parB+visibilita+"="+visibile+";");
}
inizializza();
</script>
</head>
<body>
<!-- chiamata diretta a una funzione JavaScript-->
<!--passo alla funzione il parametro "mioliv" che indica il nome del livello-->
<a href="javascript:nascondi('mioliv');">nascondi il livello</a><br/>
<a href="javascript:mostra('mioliv');">mostra il livello</a>
<br/><br/>
<div id="mioliv"><br/><br/><br/><br/><br/></div>
</body>
</html>
Se volessimo essere ancor più raffinati, non dovremmo creare due funzioni diverse, ma un unica funzione che:
- se il livello è nascosto, lo visulizza
- se il livello è visualizzato, lo nasconde
Per farlo basterebbe assegnare la visibilità in maniera variabile, e lo stato della variabile potrebbe essere deciso eseguendo a priori un controllo condizionale. Proviamo ad esprimere "a parole" questo concetto:
- se il livello è visibile --> il nuovo stato è "nascosto"
- se il livello è nascosto --> il nuovo stato è "visibile"
ci troviamo in una tipica situazione da controllo ternario. Proviamo ancora ad esprimerci aancora parole:
stato=(livello_visibile)?nascosto:visibile;
Traduciamo adesso in una sitassi adatta per Internet Explorer:
stato=(document.all["mioLiv"].style.visibility=="visible")?"hidden":"visible";
poi basta assegnare:
document.all["mioLiv"].style.visibility=stato;
Adesso basta fare le debite modifiche, tenendo conto che:
document.all["mioLiv"].style.visibility;
è per noi:
documento+parA+livello+parB+visibilita;
che "hidden" è per noi "nascosto" e "visibile" è per noi "visibile".
Infine non ci resta che cucire il tutto con eval(). Vediamo l'esempio completo:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<style type="text/css">
#mioLiv {
position:absolute;
background-color:orange;
width:300px;
height:20px;
border:1px;
visibility:show;
}
</style>
<SCRIPT TYPE="text/javaScript">
function inizializza(){
if (document.all) {
documento="document.all";
parA="["";
parB=""]";
visibilita=".style.visibility";
nascosto=""hidden"";
visibile=""visible"";
}
else if (document.layers){
documento="document.layers";
parA="["";
parB=""]";
visibilita=".visibility";
nascosto=""hide"";
visibile=""show"";
}
else if (document.getElementById) {
documento="document.getElementById";
parA="("";
parB="")";
visibilita=".style.visibility";
nascosto=""hidden"";
visibile=""visible"";
}
}
function rileva(livello) {
visibilitaLivello=documento+parA+livello+parB+visibilita;
/*se fosse explorer sarebbe:
document.all["mioLiv"].style.visibility
*/
stato = eval("("+visibilitaLivello+"=="+visibile+")?"+nascosto+":"+visibile+";");
eval(documento+parA+livello+parB+visibilita+"=""+stato+"";");
}
inizializza();
</script>
</head>
<body>
<!-- chiamata diretta a una funzione JavaScript-->
<a href="javascript:rileva('mioliv');">nascondi / mostra il livello</a><br/>
<br/><br/>
<div id="mioliv"><br/><br/><br/><br/><br/></div>
</body>
</html>
Con questo ultimo esempio abbiamo ottenuto una funzione per il cambio della visibilità di un livello, sufficientemente generica da essere adeguata a qualsiasi situazione, visto che non dipende né dal nome del livello, né dalla sua visibilità o invisibilità.
Se vuoi aggiornamenti su Development inserisci la tua email nel box qui sotto: