HTML5 and Next RIA Apps - Esplorazione di Javascript - Seconda Parte

Pagina creata da Michele Paolini
 
CONTINUA A LEGGERE
HTML5 and Next RIA Apps

Esplorazione di Javascript – Seconda Parte
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Esplorazione di Javascript – Seconda Parte
Nella scorsa lezione abbiamo iniziato l'esplorazione di Javascript, del suo ruolo
fondamentale per dominare e gestire gli elementi della pagina, di come questo viene
incluso, sia inline, che su file esterni locali e remoti.

La lezione si è conclusa con la presentazione degli array: su questo argomento (gli array) ci
fermiamo qui e verrà ripreso quando si parlerà di JSON.

Adesso ci occupiamo degli aspetti generali della pagina, di come catturare gli elementi e di
come gestire gli eventi, quindi gli argomenti di questa lezione sono:

- Tipologie di oggetti
- Gestione degli eventi in JavaScript
- BOM - Oggetto window: proprieta e metodi
- BOM - Oggetto navigator
- DOM - Interfaccia element: metodi e attributi
- DOM - Oggetto document: metodi e attributi

Infine ci occuperemo della feature detection con Modernizr

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Tipologie di oggetti
Gli oggetti disponibili per l'utilizzo negli script delle pagine HTML5 e (X)HTML possono
essere di tre diversi tipi:

– nativi
sono quelli messi a disposizione dal linguaggio;

– appartenenti al BOM (Browser Object Model)
Sono oggetti forniti dall'ambiente del browser e che permettono di interagire con
quest'ultimo, quindi NON a LIVELLO DELLA PAGINA;

– appartenenti al DOM (Documet Object Model):
Sono oggetti che operano sugli elementi presenti all'interno della pagina visualizzata dal
browser.

Gli oggetti appartenenti al DOM appaiono quindi integrati all'interno del BOM.

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Gestione degli eventi in JavaScript
JavaScript interagisce con gli attributi di evento definiti in (X)HTML per permettere di
invocare funzioni in risposta alle azioni dell'utente sugli elementi della pagina.

Ecco i principali tipi di evento:
– Eventi di documento: Apertura e chiusura di documenti

– Link: Chiamate di link

– Eventi di form:
     • Eventi dovuti alla pressione di bottoni, caselle di controllo, bottoni di invio o di reset
     • Eventi di disattivazione, attivazione e modifica in campi di testo, aree di testo e liste
di selezione

– Eventi di selezione in campi e aree di testo

– Eventi di immagini: caricamento di immagini

– Eventi del mouse: ingresso o uscita del cursore dal box di un elemento

In HTML5 ambito mobile abbiamo anche gli eventi relativi al “touch” : “touchstart”,
“touchmove”, “touchend” tra i principali

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Gestione degli eventi in JavaScript
Ecco una tabella che riassume i principali eventi intercettabili all'interno di una pagina
EVENTO           ATTRIBUTO           SI PRODUCE QUANDO

Blur             onBlur              l'input di un elemento di un form non è più evidenziato

Change           onChange            cambia il valore di un campo di testo, di un'area di testo
                                     o di un elemento di una lista di selezione
Click            onClick             si fa click su un elemento

Focus            onFocus             l'input di un elemento di un form viene evidenziato

Load             onLoad              un documento viene caricato correttamente

Mouse over       onMouseOver         il puntatore del mouse entra nel box di un elemento

Mouse out        onMouseOut          il puntatore del mouse esce dal box di un elemento

Select           onSelect            si seleziona un campo di input di un form

Submit           onSubmit            si invia un form

Unload           onUnload            viene chiuso il documento corrente, oppure viene
                                     caricato un nuovo documento

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Gestione degli eventi in JavaScript
Ad esempio considerare ed eseguire sul browser il seguente codice:
 
   Lezione 3: Gestione degli eventi in Javascript
 
             Esempio di onClick
             
             Esempio di onFocus e onBlur
             
Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

BOM - Oggetto window: proprieta
L'oggetto “window” è un oggetto del BOM che rappresenta la finestra del browser.
E' caratterizzato da un insieme di proprietà, metodi e gestori degli eventi.
E' globale, quindi non è necessario usare il nome per accedere alle proprietà e ai metodi.

Principali proprietà:
– defaultStatus: stringa contenente il messaggio predefinito visualizzato nella barra di stato
della finestra

– frames: array contenente i frame associati alla finestra

– parent: fa riferimento alla finestra o al frame il cui frameset contiene il frame corrente

– self: la finestra corrente

– status: messaggio di stato della finestra o frame corrente

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

BOM - Oggetto window: metodi ed eventi
I principali metodi dell'oggetto “window” sono:

- alert(): crea una finestra di dialogo contenente un messaggio ed un pulsante “OK”

- close(): chiude la finestra corrente. Da non confondere con document.close()

- confirm(): è simile ad alert() ma ha due pulsanti: “OK” e “Cancel”. Se l'utente seleziona
“OK” ritorna true, altrimenti false

- open(url [, titolo ,attributi]): apre una nuova finestra. Da non confondere con
document.open()

Tra i principali eventi, abbiamo:

- onLoad: intercetta il caricamento della finestra
- onUnLoad: intercetta la chiusura della finestra

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

BOM - Oggetto window: metodi ed eventi
Inoltre “navigator” è un oggetto del BOM che rappresenta il browser.

E' accessibile come proprietà dell'oggetto window e consente di accedere ad informazioni
sulla configurazione attuale del browser e del sistema attraverso alcune proprietà:

– appName: nome del browser
– appVersion: informazioni relative alla versione
– mimeTypes: array con i tipi MIME supportati
– oscpu: stringa che identifica il sistema operativo (supportato dai Mozilla-like)
– plugins: array con i plug-in installati nel browser
– userAgent: header HTTP dell'agente browser

Ecco un esempio:
1) al caricamento della pagina chiamo una funzione Javascript “detectBrowser”
2) ricavo i dettagli le proprietà del browser creando una stringa HTML
3) visualizzo la stringa dentro un DIV

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

BOM - Oggetto window: metodi ed eventi
Ecco il codice:

  Lezione 3: Gestione degli eventi in Javascript
  
     function detectBrowser()
     {
          // --- Catturo l'oggetto del DOM che mi indentifica il DIV con id="browserDetails"
          var divObj = document.getElementById('browserDetails');

           // --- Creo la stringa con codice HTML
           var details =
                'appName:' + window.navigator.appName +
                'appVersion:' + window.navigator.appVersion +
                'oscpu:' + window.navigator.oscpu +    // --- Supportato dai browser Mozilla-like
                'userAgent:' + window.navigator.userAgent +
                '';

           // --- Inserisco/disegno tale codice HMTL nel div
           divObj.innerHTML = details;
     }
  
Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

BOM - Oggetto window: metodi ed eventi
Una rappresentazione grafica del Browser Object Model può essere la seguente:

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Interfaccia "element": i principali metodi
Adesso un elenco dei principali metodi dell'interfaccia “element”:

1) getElementsByTagName("tag"):
restituisce un array di tutti gli elementi tipo tag nel sottoalbero (X)HTML avente come
radice l'elemento corrente

2) attr = element.getAttribute(attributeName)
legge il valore di un attributo dell'elemento

3) element.setAttribute(name, value)
imposta il valore di un attributo dell'elemento

4) var newElem = element.appendChild(child)
aggiunge un nuovo nodo figlio (dopo tutti gli altri)

Altri metodi: insertBefore,replaceChild,removeChild

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Interfaccia "element": i principali metodi
Consideriamo il seguente codice:
 
 Demo sull'interfaccia "element"

      Lorem Ipsum is simply dummy text of the printing and typesetting industry.
      Testo Link 1
      Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,
      when an unknown printer took a galley of type and scrambled
      Ascolta Radio 105
      it to make a type specimen book. 
      It has survived not only five centuries, but also the leap into electronic typesetting,
      Musica di Gran Classe
      remaining essentially unchanged. It was popularised in the 1960s ...
 
Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Interfaccia "element": i principali metodi
Consideriamo il seguente codice:
  /**
    * al "document ready" modifico il DOM
    */
  function elementDemo()
  {
        // === Catturo tutti i link della pagina
        var links = document.getElementsByTagName('a');
        alert('Ho trovato ' + links.length+' link nella pagina');

       // === Visualizzo il contenuto di ogni link
       for(var i=0; i
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Interfaccia "element": i principali metodi
L'oggetto document à un'oggetto del DOM che rappresenta un intero documento (X)HTML,
caricato in una finestra del browser ed è un oggetto globalmente accessibile.

L'oggetto "document" nel DOM rappresenta il nodo body del documento (X)HTML, quindi
possiede i metodi e gli attributi definiti dall'interfaccia "element"

A partire dalla versione DOM 0 (così chiamata perché non è stata mai standardizzata), sono
disponibili array che contengono tutti gli elementi di un certo tipo presenti nel documento
(nell'ordine in cui compaiono nel documento):

– applets[]: array di tutte le applets
– anchors[]: array di tutte le ancore
– embeds[]: array di tutti gli oggetti incorporati
– forms[]: array di tutti i forms
– images[]: array di tutte le immagini
– links[]: array di tutti i link

Un oggetto particolare è "document.body" oggetto che rappresenta il body del documento
(X)HTML; manipolabile come ogni altro nodo tramite l'interfaccia element

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Interfaccia "element": i principali metodi
Dell'oggetto “body” sono disponibili i seguenti attributi:

– cookie: legge o modifica i cookie associati alla pagina
– lastModified: data di ultima modifica
– location: URI del documento
– referrer: URI del documento che ha portato l'utente al documento corrente
– title: titolo del documento

Inoltre è disponibile il metodo “document.createElement('tag'); ” che crea un nuovo
elemento (da associare a un nodo preesistente con i metodi del DOM visti)

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Interfaccia "element": i principali metodi
Esercitazione 1:
A partire da un array che contiene 10 nomi di persone creare dinamicamente un elenco
puntato ul/li che continene questi nomi;

Esercitazione 2:
Creare una form HTML che contiene i campi di testo Nome,Cognome,Email e un pulsante
per validare i dati (che tutti i campi siano popolati); in base al risultato della validazione
creare dinamicamente un DIV con la frase “Dati corretti” o in alternativa “Compilare tutti i
campi”

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Uno degli aspetti più importanti per la costruzione di pagine HTML5 robuste, cioè che
possano gestire le condizioni più diverse di esecuzione, è la feature detection: ci interessa
sapere se il browser che sta eseguendo la pagina supporta effetivamente quello che
vogliamo farli eseguire, senza intoppi e senza errori.

Abbiamo due strade da seguire:
- l'interpretazione dello User Agent
- l'utilizzo di Modernizr

Interpretazione dello UserAgent
Lo UserAgent è un'applicazione installata sul computer dell'utente che si connette ad un
processo server. [http://it.wikipedia.org/wiki/User_agent]

Nel nostro caso l'applicazione è il browser che inserisce le seguenti informazioni:
- Nome in codice del browser seguito dalla versione
- Sistema Operativo
- Versione del motore di rendering
- Altre informazioni sul motore di rendering
- Nome e versione del browser

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Interpretazione dello UserAgent

Sono esempi di User Agent:

[Google Chome su MacOSX]
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko)
Chrome/17.0.963.65 Safari/535.11

[Firefox 10 su Mac OSX]
Mozilla/5.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317
Firefox/10.0a4

[Firefox su Linux con Architettura a 64bit]
Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0 Firefox/5.0

[Internet Explorer 6 su Windows XP e .NET 2.0]
Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Interpretazione dello UserAgent
L'interpretazione dello UserAgent non è la soluzione migliore per capire quali features
supporta il nostro browser per diversi motivi:

- per ricavare con precisione la versione e il sistema operativo in uso occorre scrivere script
complessi con espressioni regolari;

- in caso di nuove versioni dei browser, può cambiare il contenuto della stringa

- vi sono strumenti che possono cambiare UserAgent, facendo fingere il browser di essere
qualcun altro

Quindi per recupare lo UserAgento dovremmo “smontare” la stringa
“window.navigator.userAgent” interprentandone il contenuto o con “indexOf” oppure
mediante espressioni regolari: vediamo entrambe le soluzioni.

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Interpretazione dello UserAgent: metodo indexOf
Il metodo javascript “indexOf(frase)” applicato ad una stringa ci dice in che posizione è
contenuta la “frase” dentro la stringa, ad esempio: se nella stringa “Castro Gianfranco”
cerco il punto dove comincia la frase “Gianfranco” avrò:

      var stringa = 'Castro Gianfranco';
      alert(stringa.indexOf('Gianfranco'));
 
Mentre se cerco una frase che non c'è dentro la stringa avrò come risultato “-1”
 
 var stringa = 'Castro Gianfranco';
 alert(stringa.indexOf('EMIT'));
 
Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Interpretazione dello UserAgent: metodo indexOf
Utilizzando tale tecnica, si può quindi intercettare quale browser sta eseguendo la pagina,
con vari “trucchetti” appoggiandosi, nel caso di indexOf maggiore di -1, al punto di
partenza trovato e contando determinati caratteri:

     var UserAgent = window.navigator.userAgent;
     var indice = UserAgent.indexOf("MSIE");
     if(var versione = parseInt(navigator.appVersion.substr(indice+5) != -1 )
     {
          alert('Si tratta di Internet Explorer, ricavo la versione');
          var versione = parseInt(navigator.appVersion.substr(indice+5));
          alert('Versione di Explorer:' + versione);
     }

Come è facile intuire tale codice diventa molto articolato e difficile da gestire nell'andare a
considerare le tutte le versioni di un determinato browser a patto che non cambi la
stringa... ma non è una procedura molto affidabile.

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Interpretazione dello UserAgent: metodo delle Regular Expression
Con questa tecnica si può analizzare un modo più dettagliato una stringa attraverso le
espressioni regolari, che indicano e verificano un “modello” di stringa da rispettare; non ci
addentreremo nel significato di ogni dettaglio, ma vi mostro il codice:

var chrome = (/Chrome/.test(navigator.userAgent))?1:0;
var safari = (/safari/.test(navigator.userAgent))?1:0;
var firefox = (/firefox/.test(navigator.userAgent))?1:0;
var ie=(/MSIE (\d+\.\d+);/.test(navigator.userAgent))?1:0;
if (chrome || (chrome && safari)){
     alert('Chrome o Safari');
}
if (ie){
     var str = navigator.userAgent;
     var index = str.search(/MSIE/);
     var vers = str.substring(index+5,index+6);
     if (vers == 8 ) {
           alert('Exlorer 8');
     }
     if (vers == 7) {
           alert('Exlorer 7');
     }
}
if(safari){
     alert('Safari');
}
if(firefox){
     alert('Firefox');
}

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Uso di Modernizr
Con questa libreria si ha un approccio più preciso all'individuazione delle features
disponibili sul browser e il principio di funzionamento è: se qualcosa la posso correttamente
utilizzare/visualizzare allora la disegno nel browser, altrimenti non la faccio neanche
visualizzare nascondendola via CSS; possiamo sovrascrivere questo comportamento del
“nascondere” offrendo un contenuto alternativo.

Nell'utilizzo si procede in questo modo:
1) includo la libreria
    
    A questo punto ho a disposizione un oggetto “Modernizr” che posso utilizzare per la
feature detection ad esempio:
                  
  // === Verifico il canvas                      // === Verifico LocalStorage e Session Storage
  if (Modernizr.canvas) {                        if (Modernizr.localstorage && Modernizr.sessionstorage)
      // canvas feature                          {
  }                                                  // storage feature
  else {                                         }
      // fallback                                else {
  }                                                  // fallback
                                        }
                                                 
Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Uso di Modernizr
Gli elementi che consente di controllare Modernizr si possono riassumere nella seguente
tabella:
HTML5 features          Modernizr property             HTML5 features           Modernizr property
                        (class)                                                 (class)
Application cache       applicationcache               SVG                      svg
Audio                   audio.type (ogg, mp3,          SVG clip paths           svgclippaths
                        wav, m4a)                      Touch events             touch
Canvas                  canvas
                                                       Video                    video.type (ogg, webm,
Canvas text             canvastext                                              h264)
Drag and drop           draganddrop                    WebGL                    webgl
Form input attributes   input.attributeName            Web sockets              websockets
Form input elements     inputtypes.elementName         Web SQL database         websqldatabase
Geolocation             geolocation                    Web workers              webworkers
IndexedDB               indexeddb
Inline SVG              inlinesvg
Local storage           localstorage
Session storage         sessionstorage

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Uso di Modernizr
Ovviamente possiamo sapere la disponibilità quando l'oggetto “window” è totalmente
inizializzato, quindi:

window.onload = function() {
    // === Codice da eseguire per la verifica
};

...

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Uso di Modernizr
Ovviamente possiamo sapere la disponibilità quando l'oggetto “window” è totalmente
inizializzato, quindi:
 window.onload = function() {
     // === Devo verificare se ho l'autofocus supportato

      // --- Recupero gli elementi HTML-Form e HMTL-Input
      var form = document.forms[0],
          inputs = form.elements;

      // --- Verifoco che ho questa funzionalità
      if (!Modernizr.input.autofocus) {
          inputs[0].focus();
      }
      // --- Se non è supportata tento di emularla (se posso farlo ...)

 };

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Uso di Modernizr
Inoltre possiamo utilizzare un altro metodo interessante di Modernizr è “load” che è un
resource loader (CSS e JavaScript) che è stato fatto appositamente per lavorare fianco a
fianco con Modernizr.

Ci permette agevolmente di gestire il javascript e il CSS alternativo in caso di “failure” di
una “feature”, ad esempio il seguente codice, ci dice se includere jQuery da remoto o
locale (nel caso fossimo offline):
Modernizr.load([
   // === Gestisco il caricamento da remoto o locale
   {
      load: '//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js',
      complete: function () {
        if ( !window.jQuery ) {
               Modernizr.load('js/libs/jquery-1.7.1.min.js');
        }
      }
   },
   // === Verifico dell'autofocus
   {
     test: Modernizr.input.autofocus,
     nope: 'js/feature-emulation.js',
     complete: function() {
          // --- Richiamo un eventuale codice di inizializzazione

      }
}
]);

Pagina 1
HTML5 and Next RIA Apps – Esplorazione di Javascript – Seconda Parte

Feature Detection con Modernizr
Uso di Modernizr
Il metodo “load” è un'estenzione di un altro framework “inglobato” in Modernizr che è
YepNope.js: http://yepnopejs.com/

I meccanismi implementabili sono:
 Modernizr.load([{
    test : /* boolean(ish) - Something truthy that you want to test             */,
    yep : /* array (of strings) | string - The things to load if test is true */,
    nope : /* array (of strings) | string - The things to load if test is false */,
    both : /* array (of strings) | string - Load everytime (sugar)              */,
    load : /* array (of strings) | string - Load everytime (sugar)              */,
    callback : /* function ( testResult, key ) | object { key : fn }            */,
    complete : /* function                                                      */
 },
 ...
 ]);

Pagina 1
Puoi anche leggere