18 Script

Sommario

  1. Introduzione agli script
  2. Progettare documenti per programmi utente che supportano linguaggi di script
    1. L'elemento SCRIPT
    2. Specificare il linguaggio di script
    3. Eventi intrinseci
    4. Modifica dinamica di documenti
  3. Progettare documenti per programmi utente che non supportano linguaggi di script
    1. L'elemento NOSCRIPT
    2. Nascondere ai programmi utente i dati di script

18.1 Introduzione agli script

Uno script sul lato cliente è un programma che può accompagnare un documento HTML o essere incorporato direttamente in esso. Il programma viene eseguito sulla macchina del cliente al caricamento del documento, oppure in un qualsiasi altro momento, per esempio all'attivazione di un collegamento. Il supporto di HTML per gli script è indipendente dal linguaggio di script.

Gli script offrono agli autori un mezzo per estendere i documenti HTML in modi altamente attivi e interattivi. Ad esempio:

Vi sono due tipi di script che gli autori possono allegare ad un documento HTML:

Nota. Queste specifiche includono informazioni più dettagliate circa gli script nelle sezioni sulle macro di script.

18.2 Progettare documenti per programmi utente che supportano linguaggi di script

Le seguenti sezioni discutono temi che riguardano i programmi utente che supportano i linguaggi di script.

18.2.1 L'elemento SCRIPT

<!ELEMENT SCRIPT - - %Script;          -- dichiarazioni di script -->
<!ATTLIST SCRIPT
  charset     %Charset;      #IMPLIED  -- codifica del carattere di risorsa collegata --
  type        %ContentType;  #REQUIRED -- tipo di contenuto del linguaggio di script --
  src         %URI;          #IMPLIED  -- URI per uno script esterno --
  defer       (defer)        #IMPLIED  -- I PU possono differire l'esecuzione di script --
  >

Marcatore iniziale: obbligatorio, Marcatore finale: obbligatorio

Definizioni di attributo

src = uri [CT]
Questo attributo specifica la posizione di uno script esterno.
type = content-type [CI]
Questo attributo specifica il linguaggio di script del contenuto dell'elemento e sovrascrive il linguaggio di script predefinito. Il linguaggio di script è specificato come un tipo di contenuto (es.: "text/javascript"). Gli autori devono fornire un valore per tale attributo. Non esiste un valore predefinito per codesto attributo.
language = cdata [CI]
Disapprovato. Tale attributo specifica il linguaggio di script del contenuto di questo elemento. Il suo valore è un identificatore per il linguaggio, ma poiché questi identificatori non sono standardizzati, codesto attributo è stato disapprovato in favore di type.
defer [CI]
Quando impostato, questo attributo booleano indica al programma utente che lo script non sta per generare alcun contenuto del documento (es., nessun "document.write" in javascript) e pertanto il programma utente può proseguire con l'analisi e la riproduzione.

Attributi definiti altrove

L'elemento SCRIPT inserisce uno script all'interno di un elemento. Questo elemento può comparire un qualsiasi numero di volte nel HEAD o nel BODY di un documento HTML.

Lo script può essere definito all'interno del contenuto dell'elemento SCRIPT o in un file esterno. Se l'attributo src non è impostato, i programmi utente devono interpretare come script il contenuto dell'elemento . Se l'attributo src ha il valore di un URI, i programmi utente devono ignorare il contenuto dell'elemento e recuperare lo script tramite l'URI. Si noti che l'attributo charset fa riferimento alla codifica dei caratteri dello script designato dall'attributo src; esso non riguarda il contenuto dell'elemento SCRIPT.

Gli script sono analizzati da motori di script che devono essere noti al programma utente.

La sintassi dei dati di script dipende dal linguaggio di script.

18.2.2 Specificare il linguaggio di script

Dal momento che l'HTML non fa assegnamento su uno specifico linguaggio di script, gli autori di documenti devono comunicare esplicitamente ai programmi utente il linguaggio di ciascuno script. Ciò può essere fatto sia attraverso una dichiarazione di base sia attraverso una dichiarazione locale.

Il linguaggio di script predefinito  

Gli autori dovrebbero specificare il lingauggio di script per tutti gli script in un documento includendo la seguente dichiarazione META all'interno di HEAD:

<META http-equiv="Content-Script-Type" content="tipo">

dove "tipo" è un tipo di contenuto che denomina il linguaggio di script. Esempi di valori comprendono "text/tcl", "text/javascript", "text/vbscript".

In mancanza di una dichiarazione META, il linguaggio predefinito può essere impostato tramite un'intestazione HTTP "Content-Script-Type".

    Content-Script-Type: tipo

dove "tipo" è di nuovo un tipo di contenuto che denomina il linguaggio di script.

I programmi utente dovrebbero determinare il linguaggio di script predefinito per un documento in base ai seguenti passi (dalla priorità maggiore alla minore):

  1. Se delle dichiarazioni META specificano il "Content-Script-Type", l'ultima nel flusso di caratteri determina il linguaggio di script predefinito.
  2. Altrimenti, se delle intestazioni HTTP specificano il "Content-Script-Type", l'ultima nel flusso di caratteri determina il linguaggio di script predefinito.

Documenti che non specificano informazioni sul linguaggio di script predefinito, e che contengono elementi che definiscono uno script per eventi intrinseci, sono scorretti. I programmi utente possono tuttavia cercare di interpretare gli script non correttamente specificati, ma non sono obbligati a farlo. Gli strumenti autoriali dovrebbero generare informazioni sul linguaggio di script predefinito, per aiutare gli autori ad evitare di creare documenti scorretti.

Dichiarazione locale di un linguaggio di script 

L'attributo type deve essere specificato per ciascuna istanza dell'elemento SCRIPT in un documento. Il valore dell'attributo type per un elemento SCRIPT sovrascrive il linguaggio di script predefinito per quell'elemento.

In questo esempio, dichiariamo che il linguaggio di script predefinito è "text/tcl". Includiamo un elemento SCRIPT nell'intestazione, il cui script si trova in un file esterno ed è nel linguaggio di script "text/vbscript". Includiamo anche uno SCRIPT nel corpo del documento, che contiene il suo proprio script, scritto in "text/javascript".

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>Un documento con SCRIPT</TITLE>
<META http-equiv="Content-Script-Type" content="text/tcl">
<SCRIPT type="text/vbscript" src="http://unposto.com/progr/vbcalc">
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT type="text/javascript">
...un JavaScript...
</SCRIPT>
</BODY>
</HTML>

Riferimenti ad elementi HTML da uno script 

Ciascun linguaggio di script possiede le proprie convenzioni per riferirsi ad oggetti HTML dall'interno di uno script. Queste specifiche non definiscono un meccanismo standard per far riferimento ad oggetti HTML.

Tuttavia, gli script dovrebbero riferirsi ad un elemento in base al nome che gli è stato assegnato. I motori di script dovrebbero osservare le seguenti regole di precedenza nell'identificare un elemento: un attributo name ha la precedenza su un attributo id se entrambi sono stati impostati. In caso contrario, può essere usato o l'uno o l'altro.

18.2.3 Eventi intrinseci

Nota. Si informano gli autori che è possibile che si verifichino cambiamenti nel campo degli eventi intrinseci (ad es., nel modo in cui gli script sono collegati ad eventi). Le ricerche in questo campo sono portate avanti dal W3C Document Object Model Working Group (si consulti per maggiori informazioni il sito Web del W3C presso http://www.w3.org/).

Definizioni di attributo

onload = script [CT]
L'evento onload si verifica quando il programma utente finisce di caricare una finestra o tutti i frame all'interno di un FRAMESET. Questo attributo può essere usato con gli elementi BODY e FRAMESET.
onunload = script [CT]
L'evento onunload si verifica quando il programma utente rimuove un documento da una finestra o da un frame. Questo attributo può essere usato con gli elementi BODY e FRAMESET.
onclick = script [CT]
L'evento onclick si verifica quando il pulsante di una periferica di puntamento è cliccato sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
ondblclick = script [CT]
L'evento ondblclick si verifica quando il pulsante di una periferica di puntamento è cliccato due volte sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onmousedown = script [CT]
L'evento onmousedown si verifica quando il pulsante di una periferica di puntamento è premuto sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onmouseup = script [CT]
L'evento onmouseup si verifica quando il pulsante di una periferica di puntamento è rilasciato sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onmouseover = script [CT]
L'evento onmouseover si verifica quando una periferica di puntamento è mossa sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onmousemove = script [CT]
L'evento onmousemove si verifica quando una periferica di puntamento viene mossa mentre si trova sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onmouseout = script [CT]
L'evento onmouseout si verifica quando la periferica di puntamento è mossa via da un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onfocus = script [CT]
L'evento onfocus si verifica quando un elemento riceve il fuoco o dalla periferica di puntamento o dalla navigazione tramite selettori. Questo attributo può essere usato con i seguenti elementi: A, AREA, LABEL, INPUT, SELECT, TEXTAREA e BUTTON.
onblur = script [CT]
L'evento onblur si verifica quando un elemento perde il fuoco o dalla periferica di puntamento o dalla navigazione tramite selettori. Può essere usato con gli stessi elementi di onfocus.
onkeypress = script [CT]
L'evento onkeypress si verifica quando un tasto è premuto e rilasciato sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onkeydown = script [CT]
L'evento onkeydown si verifica quando un tasto è schiacciato sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onkeyup = script [CT]
L'evento onkeyup si verifica quando un tasto è rilasciato sopra un elemento. Questo attributo può essere usato con la maggior parte degli elementi.
onsubmit = script [CT]
L'evento onsubmit si verifica quando un modulo è inoltrato. Si applica soltanto all'elemento FORM.
onreset = script [CT]
L'evento onreset si verifica quando un modulo è riportato alla sua condizione di partenza. Si applica soltanto all'elemento FORM.
onselect = script [CT]
L'evento onselect si verifica quando un utente seleziona del testo all'interno di una campo di testo. Questo attributo può essere usato con gli elementi INPUT e TEXTAREA.
onchange = script [CT]
L'evento onchange si verifica quando un controllo perde il fuoco per l'immissione ed il suo valore è stato modificato dal momento in cui ha ottenuto il fuoco. Questo attributo si applica ai seguenti elementi: INPUT, SELECT e TEXTAREA.

È possibile associare un'azione con un certo numero di eventi che accadono quando un utente interagisce con un programma utente. Ciascuno degli "eventi intrinseci" sopra elencati assume un valore che è uno script. Lo script è eseguito tutte le volte che l'evento si verifica per quell'elemento. La sintassi dei dati di script dipende dal linguaggio di script.

Elementi di controllo quali INPUT, SELECT, BUTTON, TEXTAREA e LABEL rispondono tutti a certi eventi intrinseci. Quando questi elementi non compaiono all'interno di un modulo, possono essere usati per potenziare l'interfaccia utente grafica del documento.

Ad esempio, è possibile che gli autori vogliano includere nei loro documenti dei pulsanti di comando che non inoltrano un modulo, ma che tuttavia comunicano con un server quando sono attivati.

Gli esempi successivi mostrano possibili comportamenti di controlli ed interfaccia utente, basati su eventi intrinseci.

Nell'esempio seguente, NomeUtente è un campo di testo obbligatorio. Quando un utente tenta di abbandonare il campo, l'evento onblur richiama una funzione JavaScript, per confermare che NomeUtente abbia un valore accettabile.

<INPUT NAME="NomeUtente" onblur="validoNomeUtente(this.value)">

Ecco un altro esempio di JavaScript:

<INPUT NAME="num"
    onchange="if (!checkNum(this.value, 1, 10)) 
        {this.focus();this.select();} else {grazie()}"
    VALUE="0">

Ecco un esempio di VBScript per un gestore di eventi applicato ad un campo di testo:

    <INPUT name="modifica1" size="50">    
    <SCRIPT type="text/vbscript">
      Sub modifica1_cambiato()
        If modifica1.value = "abc" Then
          pulsante1.enabled = True
        Else
          pulsante1.enabled = False
        End If
      End Sub
    </SCRIPT>

Ed ecco lo stesso esempio usando Tcl:

    <INPUT name="modifica1" size="50">
    <SCRIPT type="text/tcl">
      proc modifica1_cambiato {} {
        if {[modifica1 value] == abc} {
          pulsante1 enable 1
        } else {
          pulsante1 enable 0
        }
      }
      modifica1 onChange modifica1_cambiato
    </SCRIPT>

Ecco qui un esempio di Javascript per collegare un evento al contenuto di uno script. Innanzitutto ecco un semplice gestore di clic:

    
<BUTTON type="button" name="miopulsante" value="10">
<SCRIPT type="text/javascript">
      function mio_onclick() {
         . . .
      }
    document.form.miopulsante.onclick = mio_onclick
 </SCRIPT>
 </BUTTON>

Ed ora un più interessante gestore di finestre:

    
<SCRIPT type="text/javascript">
      function mio_onload() {
         . . .
      }

      var fin = window.open("qualcosa/altro/URI")
      if (fin) fin.onload = mio_onload
</SCRIPT>

In Tcl ciò appare come:

 <SCRIPT type="text/tcl">
     proc mio_onload {} {
       . . .
     }
     set fin [window open "qulacosa/altro/URI"]
     if {$fin != ""} {
         $fin onload mio_onload
     }
 </SCRIPT>

Si noti che "document.write" o istruzioni equivalenti, nei gestori di eventi intrinseci, creano e scrivono un nuovo documento, piuttosto che modificare quello corrente.

18.2.4 Modifica dinamica di documenti

Gli script che sono eseguiti al caricamento di un documento possono essere abilitati a modificare dinamicamente i contenuti di un documento. La capacità di fare ciò dipende dal linguaggio di script stesso (ad es. l'istruzione "document.write" nel modello per oggetti HTML supportato da alcuni produttori).

La modifica dinamica di un documento può essere illustrata nel modo seguente:

  1. Tutti gli elementi SCRIPT sono analizzati in sequenza non appena il documento è caricato.
  2. Tutti i costrutti di script all'interno di un dato elemento SCRIPT, che producono CDATA SGML, sono analizzati. Il testo complessivo da essi generato è inserito nel documento al posto dell'elemento SCRIPT.
  3. I CDATA prodotti sono ri-analizzati.

I documenti HTML sono obbligati a mantenere la conformità alla DTD HTML sia prima sia dopo l'elaborazione di ciascun elemento SCRIPT.

L'esempio successivo mostra come uno script può modificare dinamicamente un documento. Il seguente script:

 <TITLE>Documento di prova</TITLE>
 <SCRIPT type="text/javascript">
     document.write("<p><b>Ciao Mondo!<\/b>")
 </SCRIPT>

Produce il medesimo effetto di questo codice HTML:

 <TITLE>Documento di prova</TITLE>
 <P><B>Ciao Mondo!</B>

18.3 Progettare documenti per programmi utente che non supportano linguaggi di script

Le seguenti sezioni discutono come gli autori possono creare documenti che funzionano con programmi utente che non supportano linguaggi di script.

18.3.1 L'elemento NOSCRIPT

<!ELEMENT NOSCRIPT - - (%block;)+
  -- contenitore di contenuto alternativo per riproduzione non basata su script -->
<!ATTLIST NOSCRIPT
  %attrs;                              -- %coreattrs, %i18n, %events --
  >

Marcatore iniziale: obbligatorio, Marcatore finale: obbligatorio

L'elemento NOSCRIPT permette agli autori di fornire un contenuto alternativo, quando uno script non è eseguito. Il contenuto dell'elemento NOSCRIPT dovrebbe essere riprodotto da un programma utente attrezzato per gestire script nei seguenti casi:

I programmi utente che non supportano gli script sul lato cliente devono riprodurre il contenuto di questo elemento.

Nell'esempio seguente, un programma utente che esegue lo SCRIPT includerà nel documento certi dati creati dinamicamente. Se il programma utente non supporta script, l'utente può comunque recuperare i dati attraverso un collegamento.

<SCRIPT type="text/tcl">
 ...uno script Tcl per inserire dati...
</SCRIPT>
<NOSCRIPT>
 <P>Accedi ai <A href="http://uncertoposto.com/dati">dati.</A>
</NOSCRIPT>

18.3.2 Nascondere ai programmi utente i dati di script

I programmi utente che non riconoscono l'elemento SCRIPT riprodurranno verosimilmente il contenuto di quell'elemento come testo. Alcuni motori di script, includendo quelli per i linguaggi JavaScript, VBScript e Tcl, consentono che le istruzioni di script siano racchiuse all'interno di un commento SGML. Pertanto i programmi utente che non riconoscono l'elemento SCRIPT ignoreranno il commento, mentre i motori di script intelligenti comprenderanno che lo script racchiuso nel commento dovrebbe essere eseguito.

Un'altra soluzione al problema è di mantenere gli script in documenti esterni e di riferirsi ad essi tramite l'attributo src.

Commentare gli script in JavaScript
Il motore JavaScript consente che la stringa "<!--" si trovi all'inizio di un elemento SCRIPT ed ignora ulteriori caratteri fino alla fine della riga. JavaScript interpreta "//" come l'inizio di un commento che si estende fino alla fine della riga corrente. Ciò serve per nascondere la stringa "-->" all'analizzatore Javascript.

<SCRIPT type="text/javascript">
<!--  per nascondere il contenuto dello script ai vecchi browser
  function square(i) {
    document.write("La chiamata ha passato ", i ," alla funzione.","<BR>")
    return i * i
  }
  document.write("La funzione ha restituito ",square(5),".")
// termina di nascondere il contenuto ai vecchi browser  -->
</SCRIPT>

Commentare gli script in VBScript
In VBScript un singolo carattere virgoletta fa sì che il resto della riga corrente sia trattato come un commento. Può perciò essere usato per nascondere la stringa "-->" al VBScript; per esempio:

   <SCRIPT type="text/vbscript">
     <!--
       Sub pippo()
        ...
       End Sub
     ' -->
    </SCRIPT>

Commentare script in TCL
In Tcl il carattere "#" trasforma in commento il resto della riga:

<SCRIPT type="text/tcl">
<!--  per nasconderfe il contenuto dello script ai vecchi browser
  proc square {i} {
    document write "La chiamata ha passato $i alla funzione.<BR>"
    return [expr $i * $i]
  }
  document write "La funzione ha restituito [square 5]."
# termina di nascondere il contenuto ai vecchi browser  -->
</SCRIPT>

Nota. Alcuni browser chiudono i commenti alla prima occorrenza del carattere ">"; così, per nascondere il contenuto dello script a tali browser, è possibile trasporre gli operandi per gli operatori relazionali e di traslazione (es.: usare "y < x" piuttosto che "x > y") oppure adoperare caratteri di fuga dipendenti dal linguaggio di script per ">".