Ido Green @greenido
http://plus.ly/greenido
Get the slides at bit.ly/html5LiveLondon
Oct 19, 2011
2008
2011
When can we start using HTML5?
Today!
But how can I use it safely?
Feature Detection
You are using feature detection, right?
right?
Okay, how about older browsers?
<!doctype html> <html lang="en"> <head> <title>page title</title> <meta charset=utf-8> <style> body { background-color: #ccc; } </style> </head> <body class=myClass> <article>Hello, world!</article> <input type=text required> </body> <script> console.log('Oh, hello there!'); </script> </html>
<input type="text" required />
<input type="email" value="some@email.com" />
<input type="date" min="2010-08-14" max="2011-08-14" value="2010-08-14"/>
<input type="range" min="0" max="50" value="10" />
<input type="search" results="10" placeholder="Search..." />
<input type="tel" placeholder="(555) 555-5555" pattern="^\(?\d{3}\)?[-\s]\d{3}[-\s]\d{4}.*?$" />
<input type="color" placeholder="e.g. #bbbbbb" />
<input type="number" step="1" min="-5" max="10" value="0" />
Playground For Fields
<div id="out" data-double="rainbow" data-freak="out">
// Add new data attributes via JS. var el = document.querySelector('#out'); el.setAttribute('data-foo', 'bar'); var html = []; for (var key in el.dataset) { html.push(key, ': ', el.dataset[key], '<br>'); } el.innerHTML = html.join('');
Output:
double: rainbow freak: out
if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { var latLng = new google.maps.LatLng( position.coords.latitude, position.coords.longitude); var marker = new google.maps.Marker({position: latLng, map: map}); map.setCenter(latLng); }, errorHandler); }
<input type="text" x-webkit-speech />
function startSearch(event) { if (event.target.results.length > 1) { var second = event.target.results[1].utterance; document.getElementById("second_best").value = second; } event.target.form.submit(); }
<canvas id="canvas" width="838" height="220"></canvas> <script> var canvasContext = document.getElementById("canvas").getContext("2d"); canvasContext.fillRect(250, 25, 150, 100); canvasContext.beginPath(); canvasContext.arc(450, 110, 100, Math.PI * 1/2, Math.PI * 3/2); canvasContext.lineWidth = 15; canvasContext.lineCap = 'round'; canvasContext.strokeStyle = 'rgba(255, 127, 0, 0.5)'; canvasContext.stroke(); </script>
background: linear-gradient(top, rgba(206,220,231,1) 0%, rgba(89,106,114,1) 100%);
background: radial-gradient(center, 100px 100px, red, black);
div { margin-left: -2100px; -webkit-transform: scale(0.5); -webkit-transition: all 800ms ease-in; -moz-transition: all 800ms ease-in; -o-transition: all 800ms ease-in; transition: all 800ms ease-in; } .div:hover { margin-left: auto; -webkit-transform: scale(1.0); }
<html manifest="cache.appcache">
cache.appcache:
CACHE MANIFEST # version 1.0.0 CACHE: /html5/src/logic.js /html5/src/style.css /html5/src/background.png NETWORK: *
saveButton.addEventListener('click', function () { window.localStorage.setItem('value', area.value); window.localStorage.setItem('timestamp', (new Date()).getTime()); }, false); textarea.value = window.localStorage.getItem('value');
Will eventually replace WebSQL as an object store, for storing significant quantities of structured JSON data.
var idbRequest = window.indexedDB.open('Database Name'); idbRequest.onsuccess = function(event) { var db = event.result; var transaction = db.transaction([], IDBTransaction.READ_ONLY); var curRequest = transaction.objectStore('ObjectStore Name').openCursor(); curRequest.onsuccess = ...; };
index.html
function startWorker(settings) { var myWorker = new Worker('scripts/worker.js'); myWorker.addEventListener("message", workerListener, false); myWorker.postMessage(settings); }
worker.js
self.addEventListener('message', function(e) { doSomeWork(); }; function doSomeWork() { importScripts('http://url?callBack=handleWork'); } function handleWork() { postMessage(result); }
Use chrome.fileBrowserHandler module to extend the Chrome OS file browser.
Declare the "fileBrowserHandler" permission in the extension manifest, and use the "file_browser_handlers"
{
"name": "Upload to flickr",
...
"file_browser_handlers": [
{
"id": "upload",
"default_title": "Save to flickr", // What the button will display
"file_filters": [
"filesystem:*.jpg",
"filesystem:*.jpeg",
"filesystem:*.png"
]
}
],
"permissions" : [
"fileBrowserHandler"
],
"icons": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
}
}
uploadFile: function(file) {
var pro1 = document.querySelector('#pro1');
var progressBar = pro1.querySelector('progress');
var formData = new FormData();
formData.append('file', file);
var xhr = new XMLHttpRequest();
xhr.open('POST', this.uploadServer, true);
xhr.onload = function(e) {
if (this.status == 200) {
console.log(this.response);
alert("The image is safe in Flickr " + this.response);
}
};
xhr.onerror = function(e) {
console.log(this, this.status, this.responseText,
this.getAllResponseHeaders())
};
xhr.send(formData);
},
...