Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Analizziamo una libreria

La libreria Lazy Loader in pratica
La libreria Lazy Loader in pratica
Link copiato negli appunti

Da poco pubblicata, Lazy Loader è una piccola libreria JavaScript, realizzata da Bob Matsuoka e rilasciata sotto licenza GPL che presenta una semplice ma funzionale implementazione della DLL.

La libreria, che garantisce una notevole cross-browser compatibiliy, permette la definizione di callback che vengono scatenate una volta terminato il download e presenta una cache locale per evitare doppi ed inutili download di script. Lazy Loader si appoggia alla ormai diffusissima libreria Prototype e presenta un unico metodo statico che permette di scaricare appunto uno script remoto e di eventualmente assegnare una funzione di callback.

Analizziamo il breve sorgente per capire meglio il funzionamento:

var LazyLoader = {};
LazyLoader.timer = {};
LazyLoader.scripts = [];
LazyLoader.load = function(url, callback)
{
  try
  {
    if ($A(LazyLoader.scripts).indexOf(url) == -1)
    {
      LazyLoader.scripts.push(url);
      var script = document.createElement("script");
      script.src = url;
      script.type = "text/javascript";
      $$("head")[0].appendChild(script);
      if (callback)
      {
        script.onreadystatechange = function ()
        {
          if (script.readyState == 'loaded' || script.readyState == 'complete')
          {
            callback();
          }
        }
        script.onload = function ()
        {
          callback();
          return;
        }
        // caso particolare per Opera e Safari
        if ((Prototype.Browser.WebKit && !navigator.userAgent.match(/Version/3/)) || Prototype.Browser.Opera)
        {
          LazyLoader.timer[url] = setInterval(function()
          {
            if (/loaded|complete/.test(document.readyState))
            {
              clearInterval(LazyLoader.timer[url]);
              callback();
            }
          }, 10);
        }
      }
    }
    else
    {
      if (callback) { callback(); }
    }
  }
  catch (e) { alert(e); }
}

Dopo aver inizializzato il namespace (Lazy Loader) vengono definite due variabili statiche per la gestione della cache (LazyLoader.scripts) e per la gestione dei timer (LazyLoader.timer) necessari per garantire il corretto comportamento anche su  Opera che non presenta API native JavaScript complete come i concorrenti Firefox, Internet Explorer e Safari.

Successivamente viene definito il metodo statico principale della piccola libreria. Una volta verificato che lo script non sia gia stato caricato in precedenza (e quindi non esiste all'interno della cache locale) viene modificato il DOM della pagina creando un nuovo elemento <script> con i due attributi src e type e viene appeso all'elemento <head> proprio come descritto in precedenza nella definizione dell'approccio DLL.

Inoltre, se esiste il parametro callback, esso viene assegnato all'onload dello script. Questa assegnazione presenta un meccanismo proprio per ciascun browser.

In Internet Explorer è necessario utilizzare l'evento onreadystatechange controllando ogni volta lo stato (che deve essere 'complete' o 'loaded'), mentre in Firefox e Safari su utilizza l'evento onload.

Nel caso di Opera (si noti lo sniffing sullo userAgent della richiesta tramite RegEx) è necessario creare un timeout che ogni 10 millisecondi controlla se davvero lo script è stato scaricato e in caso positivo esegue la callback definita dall'utente (e ovviamente interrompe il timeout con clearInterval()).

Se lo script è già stato scaricato in precedenza, l'eventuale funzione callback viene invocata istantaneamente. Per ultimo viene stampata a video l'eventuale eccezione lanciata dalle richieste precedenti.

Ti consigliamo anche