Far fare qualcosa dinamicamente agli elementi di una pagina
web, non è mai stato facile. Tutti conosciamo la
difficoltà nello scrivere applicazioni dhtml
crossbrowser, ma non tutti forse sappiamo dell'esistenza di
una valida soluzione: usare il Document Object
Model (DOM).
Una delle
attività del W3C, ovvero il consorzio che segue
lo sviluppo del Web e dei linguaggi da esso usati, è stata quella di
rilasciare, già a partire dall'ottobre 1998, le
specifiche del DOM Level 1
ovvero un'interfaccia standard per la programmazione (dunque una
API)
degli elementi di un documento HTML e XML.
Dov'è la “marcia in più”
di questa soluzione? Intanto il DOM, descrivendo la
struttura di una pagina attraverso i suoi elementi,
fa si che ogni programmatore possa interrogarli o
manipolarli usando il linguaggio che preferisce (anche se
si predilige javascript). Inoltre, come è dovere del
W3C, hanno pensato a qualcosa che potesse funzionare
indipendentemente dal sistema operativo e dal browser in
uso! Purtroppo però i produttori di browser non
hanno avuto la stessa rapidità nel dotare i loro
prodotti di un pieno supporto a questa specifica (ogni
browser ha comunque un suo DOM proprietario) anche se,
dobbiamo dirlo, le versioni attuali sono decisamente
migliorate sotto quest'aspetto.[1]
Questo grazie anche alla pressione di progetti come il WASP.
Ora un po' di teoria: il DOM descrive un modello gerarchico ad oggetti
(come un "albero") di tutto ciò che appare in una pagina
HTML, e fornisce metodi e attributi per operare su di essi.
Dunque un oggetto sarà indicato univocamente e riconosciuto
dalla sequenza document.element e potrà essere manipolato grazie
ai metodi (le azioni) consentiti dal DOM.
Il più importante di questi oggetti è
DOCUMENT che contiene tutti gli altri. Gli
ELEMENT sono invece contraddistinti da un
tag e possono contenere altri tag o attributi. Infine
quando sentiamo parlare di NODE vanno
intesi tutti gli elementi ma anche attributi, commenti al
codice e testo in generale, che invece non possono
contenere altri nodi. Dunque tutti gli elementi sono nodi,
ma non tutti i nodi sono elementi.
Tutto chiaro? Se no, non preoccupatevi: nel nostro articolo
vedremo esempi piuttosto semplici, e poi con esempi pratici
le idee spesso si chiariscono.
In questo articolo descriveremo una funzione javascript-dom-CSS molto usata per mostrare o nascondere un elemento (es.1). Poi vedremo come grazie a questa ed altre funzioni si possa simulare una interfaccia visuale a palette, qualcosa di simile a quella adottata dai programmi di grafica (es.2).
Guardate il codice del nostro esempio 1
1. function aprichiudi( targetId ){
2. if (document.getElementById){
3. target = document.getElementById( targetId );
4. if (target.style.display == "none"){
5. target.style.display = "block";
6. } else {
7. target.style.display = "none";
8. }
9. }
10. }
Spiegazione (per riga):
Per funzionare occorre solo che nell'HTML sia presente:
<div id="box" style="display:none">
testo di prova che verrà mostrato o nascosto
ogni volta che si clicca sul link aprichiudi
</div>
<a href="#" onclick="aprichiudi('box')">mostra/nascondi il box</a>
Il nostro obiettivo è quello di arrivare a simulare
le palette dei programmi di grafica. Dunque il prossimo
passo sarà quello di permettere al box di
essere trascinato per lo schermo. Ci servirà dotarlo di una
"maniglia". Per far ciò useremo lo script
DOM-drag creato da Youngpup.net . Non è però
obiettivo del nostro articolo spiegarne il funzionamento,
tral'altro ben descritto dai tutorial preparati dal suo
inventore. Noi vedremo solo come "usarlo" per il nostro
scopo, esattamente come abbiamo fatto nell'esempio 2.
Intanto linkiamo il file esterno (dom-drag.jsp) contenente lo script:
<script language="javascript" src="dom-drag.js"></script>
Ora occorre configurare le variabili necessarie per utilizzare questo script nel nostro esempio:
1. var theHandle, theRoot;
2. window.onload = function() {
3. theHandle = document.getElementById("maniglia");
4. theRoot = document.getElementById("paletta");
5. theRoot.style.left = "50px";
6. theRoot.style.top = "50px";
7. Drag.init(theHandle, theRoot);
8. }
Spiegazione:
Siamo invece liberi di dare ai nostri elementi paletta,
maniglia e box l'aspetto che vogliamo sia usando i CSS che
con eventuali immagini. Anche nell'HTML godiamo di buona
libertà tanto da poter creare molteplici varianti di
questa applicazione.
Ecco il nostro esempio finale. Ora tocca a voi!
[1] Internet Explorer e Netscape superiori alla versione 4, Opera dopo la 6, e tutti i browser Gecko-based (Mozilla, Galeon ecc.ecc.) supportano pienamente il DOM Level1 e "quasi pienamente" il Level2. [si vedano gli "Approfondimenti"]Nonostante ciò DOM va usato con attenzione, la stessa di sempre quando si ha a che fare con DHTML. Se non siete certi che tutti i vostri utenti usino strumenti aggiornati per navigare, ricordate di fornire loro una “soluzione alternativa” come prevedono le norme di accessibilità.
[2] Eseguiamo un controllo per verificare se il browser dell'utente supporta il DOM e il metodo che useremo; ovviamente in caso contrario la nostra funzione non produrrà alcun effetto. (“getElementById” funziona in tutti i browser superiori alla versione 4).