HTML5 brevi note conoscendo già: • html • css • javascript Vittorio Maniezzo – Università di Bologna 1 HTML5 (wikipedia) HTML5 è un linguaggio di markup per la strutturazione delle pagine web. Lo sviluppo venne avviato dal gruppo di lavoro Web Hypertext Application Technology Working Group (WHATWG) (fondato nel 2004 da sviluppatori Apple, Mozilla Foundation e Opera Software) con obiettivo progettare specifiche per lo sviluppo di applicazioni web, migliorando HTML e tecnologie correlate. Dal 2007 il WHATWG ha collaborato con il W3C in tale processo di standardizzazione, per poi decidere nel 2012 di separarsi dal processo di standardizzazione del W3C, creando di fatto due versioni dell'HTML5: la versione del WHATWG ("HTML Living Standard") in continua evoluzione, e quella del W3C che sarà una unica versione corrispondente ad uno "snapshot" del Living Standard. Il W3C ha annunciato che la prima versione dello standard sarà pronta per fine 2014 e l'html5.1 per il 2016; la prima Candidate Recommendation è stata pubblicata dal W3C il 17 Dicembre 2012. Vittorio Maniezzo – Università di Bologna 2 1 HTML5: novità Le novità introdotte dall'HTML5 rispetto all'HTML 4 vogliono migliorare il disaccoppiamento tra: • struttura, definita dal markup, • caratteristiche di resa (tipo di carattere, colori, eccetera), definite dalle direttive di stile, • contenuti di una pagina web, definiti dal testo vero e proprio. Inoltre l'HTML5 prevede il supporto per la memorizzazione locale di grosse quantità di dati scaricati dal web browser e per consentire l'utilizzo di applicazioni basate su web (come per esempio le caselle di posta di Google o altri servizi analoghi) anche in assenza di collegamento a Internet. Vittorio Maniezzo – Università di Bologna 3 HTML5: novità In particolare: • regole più stringenti per la strutturazione del testo in capitoli, paragrafi e sezioni; • nuovi elementi di controllo per i menu di navigazione; • migliorati ed estesi gli elementi di controllo per i moduli elettronici; • introdotti elementi specifici per il controllo di contenuti multimediali; • deprecati o eliminati elementi che hanno dimostrato scarso utilizzo effettivo; • estesi a tutti i tag una serie di attributi, specialmente quelli finalizzati all'accessibilità, finora previsti solo per alcuni tag; • supportato Canvas che permette di utilizzare JavaScript per creare animazioni e grafica; • introduzione della geolocalizzazione; • sistema alternativo ai normali cookie, chiamato Web Storage, più efficiente, il quale consente un notevole risparmio di banda; • standardizzazione di programmi JavaScript, chiamati Web Workers e possibilità di utilizzare alcuni siti offline; • sostituzione del lungo e complesso doctype, con un semplice <!DOCTYPE html>. Vittorio Maniezzo – Università di Bologna 4 2 Nuovi elementi Elementi introdotti in questa nota: • markup semantico, • canvas, per disegno e animazione, • supporto audio e video, • geolocalizzazione, • web storage, • web workers, • web socket, • applicazioni offline, • multidevice, • uso di HTML5 con browser vecchi. Vittorio Maniezzo – Università di Bologna 5 Markup semantico Gli elementi semantici indicano già col loro nome il loro significato al browser e agli sviluppatori. Sono alternativi al tag <div>, che definisce una divisione (una sezione) nel documento HTML, ma non ne dice nulla sul contenuto. Gli sviluppatori normalmente associano ID e classi ai <div>. I loro nomi sono significativi per gli sviluppatori, es. <div id="header">, ma non per i browser. Il W3C ha analizzato milioni di pagine web esistenti per scoprire gli ID e i nomi di classe più usati dagli sviluppatori. Il risultato è una lista di elementi descrittivi già molto in uso, che è stata resa standard. Vittorio Maniezzo – Università di Bologna 6 3 Nuovi elementi semantici Esempio pagina con div o con tag semantici. HTML 4 Vittorio Maniezzo – Università di Bologna HTML 5 7 Markup semantico Alcuni nuovi elementi semantici in HTML5: • article • aside • figcaption • figure • footer • header • hgroup • mark • nav • section • time Vittorio Maniezzo – Università di Bologna 8 4 Markup semantico e layout di pagina • header e footer indicano intestazione e piè di pagina • nav crea una barra di navigazione o di menu. • section e article raggruppano i contenuti effettivi. • aside è usato per contenuti secondari, ad es. per una barra laterale di link a elementi correlati. Vittorio Maniezzo – Università di Bologna 9 Markup semantico: esempio codice <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Titolo</title> <link rel="stylesheet" href="http://astarte.csr.unibo.it/html5/stylesheet.css" type="text/css"></head> <body> <header> <hgroup> <h1>Header, stile h1</h1> <h2>Subheader, stile h2</h2> </hgroup> </header> <nav> <p>Nav menu</p> <ul> <li><a href="#">Menu, Opzione 1</a></li> <li><a href="#">Menu, Opzione 2</a></li> </ul> </nav> <section> <article> <header> <h1>Article 1</h1> </header> <section> <p>Qui primo article. Qui <mark>evidenziato</mark>.</p> </section> </article> Vittorio Maniezzo – Università di Bologna <article> <header> <h1>Article 2</h1> </header> <section> <p>Qui secondo article.</p> </section> </article> </section> <aside> <section> <h3>Link</h3> <ul> <li><a href="http://www3.csr.unibo.it/~maniezzo/">Mio sito</a></li> <li><a href="http://astarte.csr.unibo.it/">Astarte</a></li> </ul> </section> <figure> <img width="120" height="90" src="http://www3.csr.unibo.it/~maniezzo/io.jpg" alt="Vittorio Maniezzo" /> <figcaption>Vittorio Maniezzo</figcaption> </figure> </aside> <footer>Questo e' il footer</footer> </body> </html> 10 5 Commenti al codice • Il tag <hgroup> permette di raggruppare elementi, qui gli header h1 e h2. • Il tag <mark> permette di evidenziare del testo importante. • I tag <figure> e <figcaption> permettono di inserire una figura (immagine, diagramma, foto, ecc.) e associarne una didascalia. • L'aspetto effettivo viene poi determinato dal CSS associato alla pagina. Vittorio Maniezzo – Università di Bologna 11 Form HTML5 ha introdotto vari tag e attributi specifici per le form: • input: tipi e attributi • email • url • number • date time • search • range • color • controlli • datalist • keygen • output Vittorio Maniezzo – Università di Bologna • attributi • spellcheck • autofocus • list • required • placeholder • min and max • multiple • eventi • orientationchange • resize • online • offline 12 6 Form: codice number: <form onsubmit="return false" oninput="res.value = numero.valueAsNumber"> Numero <input name="numero" type="number"/><output name="res">0</output> </form> submit: <input type="submit" value="Submit"> button: <input type="button" onclick="alert('Ahi ahi!')" value="provami"> email: <input type="email" multiple required autofocus placeholder="[email protected]" /> date time: <input type="date"/> <input type="time"/> range: <form onsubmit="return false" oninput="level.value = livello.valueAsNumber"> <label for="Numero">Scegliere il livello</label> <input name="livello" id="Numero" type="range" min="0" max="100" value="0"> <output for="Numero" name="level">0</output>/100 </form> Vittorio Maniezzo – Università di Bologna 13 Form: codice color: <input type="color"/> datalist: <input type="text" id="nomi" list="fullList" /> <datalist id="fullList"> <option value="Nome1"> <option value="Nome2"> </datalist> spellcheck: <input type="text" spellcheck="false" placeholder="No Spellcheck"> <input type="text" spellcheck="true" placeholder="Con Spellcheck"> Vittorio Maniezzo – Università di Bologna 14 7 VisualStudio: intellisense HTML5 Per avere attivo l'intellisense in VisulStudio anche per la sintassi HTML5: VisualStudio: da Tools, Options. poi nel pane espandere Text Editor, scegliere HTML e clickare Validation. Poi, dal dropdown Target, scegliere HTML5. Vittorio Maniezzo – Università di Bologna 15 Drag and drop In HTML5 il drag and drop è parte dello standard, qualunque elemento può essere reso draggable e spostato in posti predefiniti. Attributi, metodi ed eventi correlati sono: • draggable • ondragstart • setData • getData • ondragover • ondrop Vittorio Maniezzo – Università di Bologna 16 8 Drag and drop: codice <body> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Drag&drop</title> <style type="text/css"> div.dragDropBin {color:red;border:2px;width:100px;height:100px} div.HTML5LogoSmall {color:black;width:100px;height:100px} </style> <script>function allowDropDragOver(e) { e.preventDefault(); } function dragStart(e) { e.dataTransfer.setData("dragItemID", e.target.id); } function dropIt(e) { e.preventDefault(); var dataId = e.dataTransfer.getData("dragItemID"); e.target.appendChild( document.getElementById(dataId)); } </script> </head> Vittorio Maniezzo – Università di Bologna <h2>Spostare il logo fra i quadretti</h2> <table border=2px> <tr> <td> <div id="bin1" ondrop="dropIt(event)" ondragover="allowDropDragOver(event)" class="HTML5LogoSmall"> <img id="dragImage" src="Images/HTML5LogoSmall.png" draggable="true" ondragstart="dragStart(event)" class="dragImage"> </div> </td> <td><div id="bin2" ondrop="dropIt(event)" ondragover="allowDropDragOver(event)" class="dragDropBin"></div></td> </tr> <tr> <td><div id="bin3" ondrop="dropIt(event)" ondragover="allowDropDragOver(event)" class="dragDropBin"></div></td> <td><div id="bin4" ondrop="dropIt(event)" ondragover="allowDropDragOver(event)" class="dragDropBin"></div></td> </tr> </table> </body> </html> 17 Canvas Uno degli elementi più innovativi di HTML5 è il tag <canvas>. Identifica una superficie vuota su cui disegnare. Il disegno e le azioni sul canvas devono essere fatte in JavaScript. Di solito si associa al canvas un attributo id per referenziarlo dal codice JavaScript (o, usando jQuery e avendo solo un canvas nella pagina, si può usare solo $(‘canvas’)). Si possono anche specificare (opzionali) una height e una width per il canvas. Fra i tag <canvas> e </canvas> si può inserire del test che verrà visualizzato nei browser che son supportano il canvas. Vittorio Maniezzo – Università di Bologna 18 9 Codice canvas <!DOCTYPE HTML> <html> <body> <canvas id="myCanvas" width="300" height="200">Il browser non supporta il canvas.</canvas> <script type="text/javascript"> var canvas = document.getElementById('myCanvas'); var canvcont = canvas.getContext('2d'); // Bandiera italiana canvcont.fillStyle = '#00FF00'; canvcont.fillRect(0, 0, 100, 200); canvcont.fillStyle = '#FF0000'; canvcont.fillRect(200, 0, 300, 200); // Disegna una X blu canvcont.beginPath(); canvcont.lineWidth = "15"; canvcont.strokeStyle = "blue"; canvcont.moveTo(0, 0); canvcont.lineTo(300, 200); canvcont.moveTo(300, 0); canvcont.lineTo(0, 200); canvcont.stroke(); </script> </body> </html> Vittorio Maniezzo – Università di Bologna 19 Commento codice canvas Primo, si dichiara il canvas con Id “myCanvas”, width="300" e height="200". I browser vecchi visualizzano “Il browser non supporta il canvas” invece del disegno. Segue lo script che disgna. Si prende la reference tramite l'Id “myCanvas” e si dichiara il context del canvas, che permette di accedere a metodi e proprietà per disegnare. Qui context “2d”, che al momento è l'unico che esiste. Quindi si disegnano i rettangoli. Tramite fillStyle si specificano i colori e tramite fillRect si disegnano i rettangoli, specificando dimensione e posizione. Ad es., la chiamata fillRect(0, 0, 100, 200) parte da (0, 0) —angolo alto sinistra — e disegna un rettangolo con width=100 e height=200 pixel. Infine, X blu sulla bandiera. Prima beginPath che inizializza un path, disegnato con linea con lineWidth di 15 pixel e strokeStyle “blue”. Quindi si diesegna tramite moveTo, che muove il cursore senza disegnare, e lineTo, che lo muove disegnando. Alla fine la chiamata a stroke renderizza la linea. Vittorio Maniezzo – Università di Bologna 20 10 Audio and Video Altra caratteristica centrale in HTML5: possibilità di supportare la riproduzione audio e video. Prima servivano dei plug-in specifici, come Silverlight o Flash. In HTML5, si può inserire audio e video usando i tag <audio> e <video>. Sono tag molto semplici da usare e sono già supportati in tutti i maggior browser (Internet Explorer, Firefox, Chrome, Opera, Safari). Un problema nasce perché per riprodurre audio o video, servono dei codec specifici, e browser diversi supportano codec diversi. Vittorio Maniezzo – Università di Bologna 21 Audio and Video Fortunatamente, il supporto audio e video è molto flessibile. Il browser può provare formati diversi prima di fallire. Quando di pubblica un contenuto, conviene sempre presentarlo in più formati, in modo da averne uno valido per ogni tipo di browser. Al momento i formati più supportati per HTML5 sono: Audio: MP3, Wav, Ogg Video: MP4, WebM, Ogg Vittorio Maniezzo – Università di Bologna 22 11 Audio <audio controls="controls"> <source src="carica.mp3" type="audio/mp3" /> <source src="carica.ogg" type="audio/ogg" /> Il tuo browser non supporta gli audio. </audio> Qui, il browser cercherà di riprodurre il file carica.mp3. Se non ne ha il codec, prova il successivo carica.ogg. Se non viene riconosciuto il tag <audio> verrà visualizzato "Il tuo browser non supporta gli audio.". Attualmente non è predefinito nessun supporto digital rights management (DRM). Se interessa, bisogna svilupparselo da soli. Vittorio Maniezzo – Università di Bologna 23 Audio: controlli Notare l'attributo controls. Serve a visualizzare un controllo di riproduzione audio, con un bottone play/pause, il tempo, un bottone mute buttone il volume. Internet Explorer lo visualizza così: Altri browser lo visualizzano diversamente. Ecco in Chrome. Il volume è un drop-down che compare quando si passa col mouse sull'iconcina a destra. Vittorio Maniezzo – Università di Bologna 24 12 Controlli audio, manuale (TFM) Attributo Valori Descrizione Starts the audio playing as soon as it’s ready Displays audio playback controls on the page autoplay autoplay controls controls loop loop Causes audio to repeat and play again every time it finishes preload auto, metadata, none Determines whether to load the audio when the page is loaded. The value auto will load the audio, metadata will load only metadata associated with the audio file, and none will not preload audio. (This attribute will be ignored if autoplay is specified.) src (some URL) Specifies the URL of the audio file to play Vittorio Maniezzo – Università di Bologna 25 Audio: esempio controlli Ad esempio, questo codice visualizza il controllo di gestione audio e riproduce subito il file, ripetendolo indefinitamente in un loop. <audio controls="controls" autoplay="autoplay" loop="loop"> <source src="carica.mp3" type="audio/mp3" /> <source src="carica.ogg" type="audio/ogg" /> Il tuo browser non supporta gli audio. </audio> Vittorio Maniezzo – Università di Bologna 26 13 Audio: codice <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>audio</title> <script type="text/javascript"> function CMute(controlId) { document.getElementById('sampleAudio').muted =true; } function CUnMute(controlId) { document.getElementById('sampleAudio').mute d=false; } function CPause(controlId) { if (!(document.getElementById('sampleAudio').paused)) document.getElementById('sampleAudio').pause(); } function CPlay(controlId) { document.getElementById('sampleAudio').play(); } function CFullScreen(controlId) { // Per ora solo su Chrome . $(controlId)[0].webkitRequestFullScreen(); } </script> </head> <body> <p style="font-family:verdana">Audio</p> <audio id="sampleAudio" controls> <source src="files/impollinazione.mp3" type="audio/mp3"> <source src="files/impollinazione.wav" type="audio/wav"> <source src="files/impollinazione.ogg" type="audio/ogg"> Il tuo browser non supporta gli audio. </audio><br> <input type="button" value="Mute" onclick="CMute(sampleAudio);"/> <input type="button" value="Unmute" onclick="CUnMute(sampleAudio);"/> <input type="button" value="Pause" onclick="CPause(sampleAudio);"/> <input type="button" value="Play" onclick="CPlay(sampleAudio);"/> </body> </html> Vittorio Maniezzo – Università di Bologna 27 Video <video width="320" height="240" controls="controls"> <source src="movie.ogg" type="video/ogg" /> <source src="movie.mp4" type="video/mp4" /> <source src="movie.webm" type="video/webm" /> Il tuo browser non supporta i video. </video> Analogamente al caso audio, il tag video supporta sorgenti multiple, che verranno provate nell'ordine fornito finchè non se ne trova una per la quale si ha il codec. Vittorio Maniezzo – Università di Bologna 28 14 Video: controlli (TFM) Attributi audio Valori muted Descrizione Sets the default state of the audio (currently, “muted” only option) autoplay autoplay Starts the video playing as soon as it’s ready controls controls Displays video playback controls on the page height (value in pixels) Sets the height of the video player loop loop Causes video to repeat and play again every time it finishes poster (some URL) Specifies the URL of an image to represent the video when no video data is available preload auto, metadata, none Determines whether to load the video when the page is loaded. The value auto will load the video, metadata will load only metadata associated with the video file, and none will not preload video. (This attribute will be ignored if autoplay is specified.) src (some URL) Specifies the URL of the video file to play width (value in px) Sets the width of the video player Vittorio Maniezzo – Università di Bologna 29 Video: codice <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>video</title> </head> <body> <p style="font-family:verdana">Video</p> <figure> <video id="example_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="264" data-setup='{"example_option":true}'> <source src="http://html5multimedia.com/media/elephants-dream-medium.mp4" type="video/mp4"> <source src="http://html5multimedia.com/media/elephants-dream-medium.webm" type="video/webm"> <track src="files/elephants-dream-subtitles-en.vtt" label="Sottotitoli" srclang="en" default> Il tuo browser non supporta i video. </video> <figcaption>© copyright 2006, Blender Foundation / Netherlands Media Art Institute /<br/><a href="http://www.elephantsdream.org">www.elephantsdream.org</a></figcaption> </figure><br> </body> </html> Vittorio Maniezzo – Università di Bologna 30 15 Geolocalizzazione La geolocalizzazione serve per individuare la posizione geografica dell'utente, tramite le coordinate di latitudine e longitudine. Questi sono dati personali dell'utente, che ne possono compromettere la privacy. E' quindi necessario un permesso esplicito dell'utente per localizzarne la posizione. Per utilizzare la geolocalizzazione, si sfrutta l'oggetto navigator.geolocation. Vittorio Maniezzo – Università di Bologna 31 navigator.geolocation Parametri • position • coords (Coordinate): localizzazione dell'utente • • • • • • • latitude longitude altitude accuracy altitudeAccuracy speed heading Metodi • getCurrentPosition: rilava la posizione (una volta) • watchPosition: rileva continuativamente la posizione • clearWatch: smette di rilevare la posizione • timestamp (DOMTimeStamp): tempo in cui si è ottenuta la posizione • PositionError: error callback object • UNKNOWN_ERROR = 0 • PERMISSION_DENIED = 1 • POSITION_UNAVAILABLE = 2 • TIMEOUT = 3 • code • message • PositionOptions: opzioni di georeferenziazione • enableHighAccuracy • timeout • maximumAge Vittorio Maniezzo – Università di Bologna 32 16 Georef: codice latlong <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>LatLong</title> </head> <body> <div align="center" style="padding:30px;"> <p id="demo">Click per avere le coordinate</p> <button onclick="getLocation()">getLocation</button> </div> <script type="text/javascript"> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition,showError); } else{x.innerHTML="Geolocation is not supported by this browser.";} } function showPosition(position) { x.innerHTML="Latitudine: " + position.coords.latitude + "<br>Longitudine: " + position.coords.longitude; } function showError(error) { switch(error.code) { case error.PERMISSION_DENIED: x.innerHTML="Permesso negato." break; case error.POSITION_UNAVAILABLE: x.innerHTML="position unavailable." break; case error.TIMEOUT: x.innerHTML="Richiesta in timeout." break; case error.UNKNOWN_ERROR: x.innerHTML="Errore sconosciuto." break; } } </script> </body> </html> Vittorio Maniezzo – Università di Bologna 33 Georef: codice google maps <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>geoLoc Google Maps</title> </head> <body> <div align="center" style="padding:30px;"> <p id="demo">Click per avere la mappa</p> <button onclick="showMap()">showMap</button> </div> <center><div id="mapView" style="width:500px;height:380px;" ></div></center> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></scri pt> <script type="text/javascript"> var x=document.getElementById("demo"); function showMap() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showMapLocation, showError); } } function showError(error) { switch(error.code) { … } } Vittorio Maniezzo – Università di Bologna function showMapLocation(position) { var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); var myOptions = { zoom: 16, center: latlng, mapTypeControl: false, navigationControlOptions: { style: google.maps.NavigationControlStyle.SMALL }, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("mapView"), myOptions); var marker = new google.maps.Marker({ position: latlng, map: map, draggable:true, title: "Tu sei qui! (Accuratezza: " + position.coords.accuracy + " metri)" }); x.innerHTML="Latitudine: " + position.coords.latitude + " Longitudine: " + position.coords.longitude; google.maps.event.addDomListener(window, 'load', initialize); } </script> </body> </html> 34 17 Web storage HTML5 permette di memorizzare dati in locale al browser client. Alternativa ai cookies, che sono lenti, in chiaro, limitati a 4KB e da includere in ogni richiesta HTTP. Web Storage è più sicuro e veloce. Spazio disponibile sul client ~5MB, persistente e trasmesso solo quando richiesto. Due tipi di memorizzazione: localStorage: dati senza scadenza • dati tipo Key/Value pair • condivisi fra window/tab di uno stesso dominio • disponibili finché cancellati esplicitamente dall'utente sessionStorage: dati memorizzati solo per la sessione • dati tipo Key/Value pair • Specifici a una particolare window/tab Vittorio Maniezzo – Università di Bologna 35 Web storage: controlli Web Storage usa un'interfaccia che espone API per creare, leggere, aggiornare o cancellare (CRUD) dati sul client: • getItem(DOMString key): restituisce il valore di un elemento data la chiave • setItem(DOMString key, any data): crea o modifica il valore di un elemento • removeItem(DOMString key): cancella un elemento data la chiave • clear() : Cancella tutti gli elementi • length : Numero degli elementi memorizzati • key(unsigned long index): restituisce la chiave di un elemento identificato da un indice (base 0) Vittorio Maniezzo – Università di Bologna 36 18 Web storage: codice <head> <script type="text/javascript"> function SaveToSessionStorage() { window.sessionStorage.mySessionKeyX = 'Chiave X'; window.sessionStorage.setItem("mySessionKeyX" ,"Dato salvato in sessione, chiave X"); alert("Session: dato memorizzato"); } function SaveToLocalStorage() { window.localStorage.myLocalKeyA = 'Chiave A'; window.localStorage.setItem("myLocalKeyA", "Dato salvato in localStorage, chiave X"); alert("Local: dato memorizzato"); } function GetFromSessionStorage() { alert("Value X: " + window.sessionStorage.getItem("mySessionKeyX")); } function GetFromLocalStorage() { alert("Value A: " + window.localStorage.getItem("myLocalKeyA")); } function RemoveFromSessionStorage() { window.sessionStorage.removeItem("mySessionKeyX"); } function RemoveFromLocalStorage() { window.localStorage.removeItem("myLocalKeyA"); } <body> function clearAll() <div align="center" style="padding:5px;background-color:#EFCAA8;"> { localStorage.clear(); <p id="session">Click per memorizzare dati in sessione</p> sessionStorage.clear(); <button onclick="SaveToSessionStorage()">SaveToSessionStorage</button> } <button onclick="GetFromSessionStorage()">GetFromSessionStorage</button> </script> <button onclick="RemoveFromSessionStorage()">RemoveFromSessionStorage</button> </head> </div> … 37 Vittorio Maniezzo – Università di Bologna </body> Web workers Web Workers in HTML5 è uno script JavaScript che viene eseguito in background dopo essere lanciati da una pagina. Funziona indipendentemente dagli altri script e non influenza la performance della pagina. Normalmente, lanciando script in una pagina HTML, la pagina non risponde più finché gli script non terminano. Web Workers permette di lanciare processi in background, in parallelo al processo browser (main). Quindi la pagina resta responsive anche se il worker è in esecuzione. Web workers sono processi esterni al main, quindi non possono accedere a oggetti JavaScript quali: • window object • document object • parent object Vittorio Maniezzo – Università di Bologna 38 19 Web workers: codice <head> <meta charset="utf-8" /> var i=0; <title>webworkers</title> function timedCount() <script type="text/javascript"> { i=i+1; var w; postMessage(i); function startWorker() setTimeout("timedCount()",500); { if(typeof(Worker)!=="undefined") } { if(typeof(w)=="undefined") timedCount(); { w=new Worker("demo_workers.js"); } w.onmessage = function (event) { document.getElementById("result").innerHTML=event.data; }; } else { document.getElementById("result").innerHTML="Il tuo browser non supporta i Web Workers..."; } } function stopWorker() { w.terminate(); document.getElementById("result").innerHTML="Fine"; } </script> </head> <body> <p>[Gira su un server vero] Conta: <output id="result"></output></p> <button onclick="startWorker()">Start Worker</button> <button onclick="stopWorker()">Stop Worker</button> <br> </body> Vittorio Maniezzo – Università di Bologna 39 Web socket Una Web Socket in HTML5 realizza un canale di comunicazione bidirezionale su una connessione TCP (cioè una socket). Le API WebSocket sono definite dal W3C (World Wide Web Consortium) e il protocollo WebSocket è stato standardizzato dall'IETF (Internet Engineering Task Force). Sono stati definiti due nuovi protocolli - ws: e wss: Semplifica le comunicazioni client-server. Per stabilire una connessione fra un client e un server, viene inviata una richiesta di upgrade della connessione HTTP. Ottenuto l'upgrade e fatto un handshake, il client e il server possono scambiarsi dei frame. Il server notifica anche al client nuovi messaggi. Schema di utilizzo: 1. crea un web socket 2. dichiara un event listener 3. invia messaggi Vittorio Maniezzo – Università di Bologna 40 20 Web socket: metodi e eventi Attributi, metodi e eventi websocket sono: • readyState • bufferedAmount • onopen • onmessage • onclose • onerror • send() • close() Vittorio Maniezzo – Università di Bologna 41 Web socket: codice <script type="text/javascript"> function WebSocketTest() { if ("WebSocket" in window) { // Open a Web Socket var ws = new WebSocket("ws://echo.websocket.org/"); ws.onopen = function () { // Send data ws.send("Dati inviati"); alert("Messaggio inviato!"); }; ws.onmessage = function (evt) { //Recieve data var receivedmsg = evt.data; alert("Messaggio ricevuto dal server: "+ receivedmsg); }; ws.onclose = function () { // Close a Websocket alert("Chiusa la connessione"); }; ws.onerror = function (evt) { // Log Error <body> alert("ERRORE " + evt.message); <p>test web socket</p> }; <button onclick="WebSocketTest()">WebSocketTest</button> } <br> } </body> </script> Vittorio Maniezzo – Università di Bologna 42 21 Applicazioni offline HTML5 Offline permette di usa una applicazione web anche quando non c'è una rete cui connettersi. La web application referenzia un manifest che specifica quali file devono essere mantenuti in cache e quali no, oltre a regole (fallback rules) su come gestire I file non in cache. Le copie locali in cache non hanno una data di scadenza. Se l'applicazione trova delle variazioni nel manifest quando va online, aggiorna i file locali, altrimenti li usa come sono. In mancanza di rete (viene detto da un flag "onLine" presente nel DOM), le pagine web e i dati correlati vengono caricati dalle copie in cache. Vittorio Maniezzo – Università di Bologna 43 Multidevice HTML5 permette di supportare device diversi, è fondamentale per l'accesso mobile. Viewport Meta Tag • controlla il modo in cui i browser visualizzano la pagina, specificando come il contenuto va disposto nello schermo del device. • informa il browser che il sito è ottimizzato per dispositivi mobili. Esempio: <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=yes"/> Vittorio Maniezzo – Università di Bologna 44 22 Multidevice: media queries CSS Media Query – sono stylesheet che permettono di personalizzare la presentazione del contenuto per uno specifico insieme di dispositivi senza dover cambiare il contenuto stesso. Tre modi di definirle: • Foglio di stile esterno: <link rel="stylesheet" media="handheld, only screen and (maxdevice-width: 320px)" href="phone.css"> <link rel="stylesheet" media="only screen and (min-width: 641px) and (max-width: 800px)" href="tablet.css"> • Dentro la sezione <style> (o in un file css), media rule: @media only screen and (max-width: 480px) {/* le regole definite qui si applicano solo a browser che supportano le CSS media queries e con una finestra di 480px o meno*/ } • Stylesheet importato in una sezione <style> : @import "smallscreen.css" only screen and (max-width: 480px); Vittorio Maniezzo – Università di Bologna 45 Compatibilità I browser supportano HTML5 in realtà ne supportano parti diverse, e alcune funzionalità possono essere realizzate in modo diverso. Il modo per permettere a tutti di usare il sito sono i polyfill. Un polyfill è una piccola libreria che accetta le API non supportate, garantendo il fallback a browser vecchi. Un modo per aggiungere i polyfill è ad es. linkare la libreria JavaScript Modernizr (ma ce ne sono molte). Modernizr aggiunge capacità di feature detection che permettono di scoprire cosa non è supportato dal browser e di fornire una opzione di backup se serve. Vittorio Maniezzo – Università di Bologna 46 23 Modernizr Per aggiungere la reference a Modernizr (senza dover cambiare niente nel codice) bisogna scaricarlo da http://www.modernizr.com/download/ aggiungere nella <head> della pagina: <head> <meta charset="utf-8" /> <title>Title</title> <link href="css/html5reset.css" rel="stylesheet" /> <link href="css/style.css" rel="stylesheet" /> <script src="script/jquery-1.6.2.min.js" type="text/javascript"></script> <script src="script/modernizr-2.0.6.js" type="text/javascript"></script> </head> Vittorio Maniezzo – Università di Bologna 47 24