Eventi legati al caricamento degli oggetti



A questo gruppo si possono ricondurre i seguenti eventi:

  1. onLoad: Questo handler funziona nel caricamento di oggetti, per lo più finestre e immagini;
  2. onUnload: è l'opposto del precedente e funziona quando si lascia una finestra per caricarne un'altra o anche per ricaricare la stessa (col tasto refresh);
  3. onAbort: funziona quando l'utente ferma il caricamento di un oggetto cliccando su un altro link o premendo il tasto stop del browser;
  4. onError: si attiva quando il caricamento di un oggetto causa un errore, ma solo se questo è dovuto ad un errore di sintassi del codice e non del browser così funziona su un link errato di un'immagine della pagina, ma non su un link errato di caricamento di una pagina intera;
  5. onBeforeUnload: questo handler funziona allo stesso modo di onUnload ma si carica in un momento prima;
  6. onStop: questo handler funziona quando si ferma il caricamento della pagina con il tasto stop del browser e dovrebbe funzionare anche allo stesso modo di onUnload caricandosi prima di questo ma dopo onBeforeUnload.

Gli ultimi due eventi sono nati come particolarità di Internet Explorer 5.0 e richiedono ulteriori conoscenze per poter essere adoperati.

Per le versioni più vecchie di Javascript ecco il quadro riepilogativo in rosso sono indicate le modifiche apportate nelle diverse versioni dei browser):

Evento Versione JavascriptNN2.0NN3.0NN4.0NN4.06IE3.0IE4.0IE5.0
onLoad 1.0 *******
onUnload 1.0 *******
onAbort 1.1  *****
onError 1.1  *** **
onBeforeUnload DHTML      *
onStop DHTML       *

Tag sensibili

Altro limite è dato dai tag a cui l'evento può essere associato:

EventoTag associati in Netscape e JScript
onLoad Questo gestore è usato con i tag <body> e <frameset> e da Javascript 1.1anche con <img> mentre in Explorer occorre aggiungere anche i tag <script>, <link>, <embed>, <applet>. In Javascript 1.2, su Netscape, si aggiungeva anche il tag <layer>
onUnload Questo gestore è usato con i tag <body> e <frameset> anche in Internet Explorer
onAbort Questo gestore è usato solo con il tag <img> anche in Internet Explorer
onError Questo gestore è usato solo con il tag <img> e con Window mentre in Internet Explorer anche con <object> e <style>
onBeforeUnload Questo gestore è usato con i tag <body> anche in Internet Explorer
onStop Questo gestore è usato con i tag <body> anche in Internet Explorer

onBeforeUnload/onStop/onUnload

Sulla precedenza di questi eventi clicca qui per un esempio

onLoad

Questo evento, se ben utilizzato potrebbe simulare un effetto streaming mediante caricamento di immagini (gif, png o jpeg). Supponiamo di avere a disposizione una serie di jpeg da animare. Con questo evento possiamo sincronizzare la visualizzazione delle varie figure alla fine del caricamento della precedente mediante uno script del genere:

<script type="text/javascript">

var whichImage = 0;
var maxImages  = 5;

function changeAnimation(theImage)
{
  ++whichImage;
  
  if (whichImage < maxImages) {
    var imageName="numbers/number" + whichImage + ".jpg";
    theImage.src = imageName;
  }
  else { whichImage = -1; } 
}
</script>

<img id="changingAnimation" src="numbers/number0.jpg" 
     onLoad="changeAnimation(this)"> 

Naturalmente questo script funzionerebbe bene per immagini molto grandi, che richiedano almeno qualche decimo di secondo per il caricamento. In caso contrario non riusciremmo a cogliere le transizioni tra un'immagine e l'altra a causa dell'elevata velocità di caricamento.

Molto più spesso utilizziamo l'evento onLoad per essere sicuri di lanciare altri script solo al termine del caricamento della pagina:

<script type="text/javascript">
function pageLoaded()
{
   // da fare alla fine del caricamento
}

windows.onload = pageLoaded;

</script>

onError

Una particolare menzione merita l'evento onError per la sua grande utilità ma per lo scarso utilizzo che se ne fa. Questo evento può:

  1. sopprimere i messaggi di errore che il debugger mostrerebbe (dai messaggi discreti di Netscape, ai più antiestetici in Explorer) il tutto mediante un codice come questo:
    <img src="corrupt.gif" onError="null">
  2. se il codice è espresso nella sezione <head>, diventa attivo per tutta la finestra e per tutti gli eventi di errore attivati dagli oggetti ivi contenuti
    <script>window.onerror=null</script>
    tuttavia un evento onError associato alla singola immagine o oggetto cattura l'evento per questa immagine o oggetto a discapito di quello generale
  3. l'evento può fare di più: può indicare il tipo di errore, la riga e l'URL che lo hanno causato e indicarlo in una finestra o memorizzarlo in un array. Di seguito possiamo esaminare un istruttivo esempio, preso dal Reference di Netscape, che serve a costruire un debugger personalizzato. Nello script ci sono degli errori e, cliccando sul primo bottone e poi sul secondo si possono individuare.

Lo script citato nel terzo caso è questo:

<script>
// handler
window.onerror = myOnError;

msgArray = new Array();
urlArray = new Array();
lnoArray = new Array();

function myOnError(msg, url, lno) {
  msgArray[msgArray.length] = msg;
  urlArray[urlArray.length] = url;
  lnoArray[lnoArray.length] = lno;
  return true;
}

function displayErrors() {
  win2 = window.open('','window2','scrollbars=yes');
  win2.document.writeln('<strong>Error Report</strong> <p>');
  
  for (var i=0; i < msgArray.length; i++) {
   win2.document.writeln('<strong>Error in file:</strong> ' + urlArray[i] + '<br /> ');
   win2.document.writeln('<strong>Line number:</strong> ' + lnoArray[i] + '<br />');
   win2.document.writeln('<strong>Message:</strong> ' + msgArray[i] + '</p>');
  }
  win2.document.close();
 }
</script>

<form>
  <!--bottone con l'errore-->
  <input type="button" value="Questo bottone ha un errore di sintassi"
         onClick="alert('unterminated string)" name="button" />
  <br />
  <input type="button" value="Visualizza l'errore" 
         onClick="displayErrors()" name="button2" />
</form> 

I dati forniti da onError vengono memorizzati in tre variabili standard, che abbiamo intercettato attraverso la firma dell'handler (i tre parametri della funzione):

VariabileDescrizione
msgIl messaggio di errore che indica il tipo di eccezione sollevata
urlL'indirizzo della pagina in cui si è verificato l'errore
lnoNumero di linea del codice difettoso

Vediamo in pratica l'esempio:

Esempio di gestione dell'errore

Cliccare prima qui

Poi qui

Questo sistema funziona solo con Firefox e Internet Explorer, sugli altri browser possiamo utilizzare comunque onError come sistema semplice per intercettare le eccezioni.

Per lavorare un po' più di fino, possiamo utilizzare invece il costrutto try-catch-finally, ecco un semplice esempio:

<script type="text/javascript">
<!--
try
{
  document.write(10/0) ;
}
catch(e)
{
  alert(e.message);
}
finally
{
  document.write("questo codice viene eseguito comunque.");
}
-->
</script> 

Ultimi articoli JavaScript

PhantomJS, headless browser per test con Javascript

Il tool ideale per realizzare, da terminale, operazioni in remoto su...

Creare e leggere QR Code in JavaScript

Applicazioni 'QR Code enabled' per il Web e per il mobile,...

Jquery UI Map: web-mapping con Google Maps e jQuery

Un plugin di jQuery UI per intefacciare applicaizoni Web/mobile con...

Scrollorama e Scrolldeck, slideshow d'effetto con jQuery

Plugin jQuery per ottenere Slideshow con diversi effetti di scrolling

jCanvas, un primo semplice grafico

Alla scoperta della libreria jCanvas, per semplificare il disegno e...

Altri articoli

Guide JavaScript

Guida Node.js

Il framework che permette di per usare V8, l'interprete JavaScript...

Canvas, guida ai framework

Canvas, tra gli elementi di HTML5 è forse quello di maggior impatto....

Guida Javascript: tecniche avanzate

Una guida dal taglio pratico per approfondire la programmazione a...

Altre guide

Newsletter @JavaScript

Ogni martedì, direttamente nella tua e-mail: guide, articoli, script, novità e approfondimenti tecnici su JavaScript.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Webmaster base

18 Giugno 2012 a Milano
Disponibilità: 6 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso JQuery e Ajax per Webmaster

03 Luglio 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti

Corso Webmaster base

11 Giugno 2012 a Roma
Disponibilità: 7 Posti