113
APIs HTML5 HTML5 JavaScript APIs Browser codebits.eu 2009

codebits 2009 HTML5 JS APIs

Embed Size (px)

DESCRIPTION

HTML5 is all the rage with the cool kids, and although there's a lot of focus on the new language, there's lots of interesting new JavaScript APIs both in the HTML5 spec and separated out. This presentation will take you through demos and code and show off some of the outright crazy bleeding edge demos that are being produced today using the new JavaScript APIs.

Citation preview

Page 1: codebits 2009 HTML5 JS APIs

APIs

HTML5

HTML5 JavaScript APIs

Browser

codebits.eu 2009

Page 2: codebits 2009 HTML5 JS APIs

HTML5

Page 3: codebits 2009 HTML5 JS APIs

Web Forms

Audio/Video

Canvas

Offline

Drag & Drop

Editable

History API

Undo

X-Domain

Messaging

HTML5

Page 4: codebits 2009 HTML5 JS APIs

“HTML5”

Page 5: codebits 2009 HTML5 JS APIs

Web Forms

Audio/Video

Canvas

Offline

Drag & Drop

Editable

History API

Undo

X-Domain

MessagingStorage

Databases

Sockets

Geolocation

querySelector Workers

Server Events

“HTML5”

Page 6: codebits 2009 HTML5 JS APIs

“HTML5”

•Video

•Canvas

•Offline

•Storage

•Workers

Page 7: codebits 2009 HTML5 JS APIs

“HTML5”

•Video

•Canvas

•Offline

•Storage

•Workers

Page 8: codebits 2009 HTML5 JS APIs

“HTML5”

•Video

•Canvas

•Offline

•Storage

•Workers

Page 9: codebits 2009 HTML5 JS APIs

Video(and audio)

Page 10: codebits 2009 HTML5 JS APIs

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/oHg5SJYRHA0&hl=en&fs=1&" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/oHg5SJYRHA0&hl=en&fs=1&" allowscriptaccess="always" allowfullscreen="true"></embed></object>

Page 11: codebits 2009 HTML5 JS APIs

<video src="dizzy.ogv" />

Page 12: codebits 2009 HTML5 JS APIs
Page 13: codebits 2009 HTML5 JS APIs

<video> <source src="dizzy.ogv" /> <source src="dizzy.mp4" /></video>

Page 14: codebits 2009 HTML5 JS APIs

?

Page 15: codebits 2009 HTML5 JS APIs

<video> <source src="dizzy.ogv" /> <source src="dizzy.mp4" /></video>

Page 16: codebits 2009 HTML5 JS APIs

<video> <source src="dizzy.ogv" /> <source src="dizzy.mp4" /> <!-- QuickTime support --> <object><param></object></video>

Page 17: codebits 2009 HTML5 JS APIs

<video> <source src="dizzy.ogv" /> <source src="dizzy.mp4" /> <!-- QuickTime support --> <object><param></object> <!-- down to flash --> <object><param></object></video>

Page 18: codebits 2009 HTML5 JS APIs

<video> <source src="dizzy.ogv" /> <source src="dizzy.mp4" /></video>

Page 19: codebits 2009 HTML5 JS APIs

http://html5demos.com/video

Page 20: codebits 2009 HTML5 JS APIs

if (video.paused) { if (video.ended) { video.currentTime = 0; } video.play();} else { video.pause();}

http://html5demos.com/video

Page 21: codebits 2009 HTML5 JS APIs

if (video.paused) { if (video.ended) { video.currentTime = 0; } video.play();} else { video.pause();}

http://html5demos.com/video

Page 22: codebits 2009 HTML5 JS APIs

if (video.paused) { if (video.ended) { video.currentTime = 0; } video.play();} else { video.pause();}

http://html5demos.com/video

Page 23: codebits 2009 HTML5 JS APIs

if (video.paused) { if (video.ended) { video.currentTime = 0; } video.play();} else { video.pause();}

http://html5demos.com/video

Page 24: codebits 2009 HTML5 JS APIs

addEvent( video, 'timeupdate', function () { positon.innerHTML = ➥ asTime(this.currentTime); });

http://html5demos.com/video

Page 25: codebits 2009 HTML5 JS APIs

addEvent( video, 'timeupdate', function () { positon.innerHTML = ➥ asTime(this.currentTime); });

http://html5demos.com/video

Page 26: codebits 2009 HTML5 JS APIs

addEvent( video, 'timeupdate', function () { positon.innerHTML = ➥ asTime(this.currentTime); });

http://html5demos.com/video

Page 27: codebits 2009 HTML5 JS APIs

•play(), pause()

•paused, ended, currentTime

•canplay, timeupdate, ended

•and a bunch more.

Page 28: codebits 2009 HTML5 JS APIs

•Bugs tend to be rather quiet...shhh...

•Firefox needs the right content-type

•Safari will plough ahead

Page 29: codebits 2009 HTML5 JS APIs

Accessibility?

Page 31: codebits 2009 HTML5 JS APIs

Canvas(+ excanvas.js)

Page 32: codebits 2009 HTML5 JS APIs
Page 33: codebits 2009 HTML5 JS APIs
Page 34: codebits 2009 HTML5 JS APIs

<!DOCTYPE html><html><head> <title>Canvas</title></head><body> <canvas></canvas></body></html>

Page 35: codebits 2009 HTML5 JS APIs

var ctx = canvas.getContext('2d');

Page 36: codebits 2009 HTML5 JS APIs

var ctx = canvas.getContext('2d');

// Create radial gradientvar grad = ctx.createRadialGradient(0,0,0,0,0,600);

Page 37: codebits 2009 HTML5 JS APIs

var ctx = canvas.getContext('2d');

// Create radial gradientvar grad = ctx.createRadialGradient(0,0,0,0,0,600); grad.addColorStop(0, '#E4E4E4');grad.addColorStop(1, '#000');

Page 38: codebits 2009 HTML5 JS APIs

var ctx = canvas.getContext('2d');

// Create radial gradientvar grad = ctx.createRadialGradient(0,0,0,0,0,600); grad.addColorStop(0, '#E4E4E4');grad.addColorStop(1, '#000');

// assign gradients to fillctx.fillStyle = grad;

Page 39: codebits 2009 HTML5 JS APIs

var ctx = canvas.getContext('2d');

// Create radial gradientvar grad = ctx.createRadialGradient(0,0,0,0,0,600); grad.addColorStop(0, '#E4E4E4');grad.addColorStop(1, '#000');

// assign gradients to fillctx.fillStyle = grad; // draw 600x600 fillctx.fillRect(0,0,600,600);

Page 40: codebits 2009 HTML5 JS APIs
Page 41: codebits 2009 HTML5 JS APIs

Let's mix it up

Page 43: codebits 2009 HTML5 JS APIs

body.onmousemove = function (event) { var width = window.innerWidth, height = window.innerHeight, x = event.clientX, y = event.clientY, rx = 600 * x / width, ry = 600 * y / width; var xc = parseInt(256 * x / width); var yc = parseInt(256 * y / height);

grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); grad.addColorStop(0, '#000'); grad.addColorStop(1, 'rgb('+xc+','+(255-xc)+','+yc+')');

ctx.fillStyle = grad; ctx.fillRect(0,0,600,600);};

http://html5demos.com/canvas-grad

Page 44: codebits 2009 HTML5 JS APIs

body.onmousemove = function (event) { var width = window.innerWidth, height = window.innerHeight, x = event.clientX, y = event.clientY, rx = 600 * x / width, ry = 600 * y / width; var xc = parseInt(256 * x / width); var yc = parseInt(256 * y / height);

grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); grad.addColorStop(0, '#000'); grad.addColorStop(1, 'rgb('+xc+','+(255-xc)+','+yc+')');

ctx.fillStyle = grad; ctx.fillRect(0,0,600,600);};

http://html5demos.com/canvas-grad

Caclulate from the mouse the

radius and colours

Page 45: codebits 2009 HTML5 JS APIs

body.onmousemove = function (event) { var width = window.innerWidth, height = window.innerHeight, x = event.clientX, y = event.clientY, rx = 600 * x / width, ry = 600 * y / width; var xc = parseInt(256 * x / width); var yc = parseInt(256 * y / height);

grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); grad.addColorStop(0, '#000'); grad.addColorStop(1, 'rgb('+xc+','+(255-xc)+','+yc+')');

ctx.fillStyle = grad; ctx.fillRect(0,0,600,600);};

http://html5demos.com/canvas-grad

Re-render the gradient

Page 46: codebits 2009 HTML5 JS APIs

body.onmousemove = function (event) { var width = window.innerWidth, height = window.innerHeight, x = event.clientX, y = event.clientY, rx = 600 * x / width, ry = 600 * y / width; var xc = parseInt(256 * x / width); var yc = parseInt(256 * y / height);

grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); grad.addColorStop(0, '#000'); grad.addColorStop(1, 'rgb('+xc+','+(255-xc)+','+yc+')');

ctx.fillStyle = grad; ctx.fillRect(0,0,600,600);};

http://html5demos.com/canvas-grad

Set the new fill style and refill -

the browser handles the hard

work

Page 47: codebits 2009 HTML5 JS APIs

body.onmousemove = function (event) { var width = window.innerWidth, height = window.innerHeight, x = event.clientX, y = event.clientY, rx = 600 * x / width, ry = 600 * y / width; var xc = parseInt(256 * x / width); var yc = parseInt(256 * y / height);

grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); grad.addColorStop(0, '#000'); grad.addColorStop(1, 'rgb('+xc+','+(255-xc)+','+yc+')');

ctx.fillStyle = grad; ctx.fillRect(0,0,600,600);};

http://html5demos.com/canvas-grad

Page 48: codebits 2009 HTML5 JS APIs

canvas.toDataURL("image/png");

Page 49: codebits 2009 HTML5 JS APIs

canvas.toDataURL("image/png");data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFxUlEQVR4Ae3dQW5jORAEUXvQ97+yezCzNQpNyPwdIp+XJkVlRTKgheGvz69/fz78IIDAtwT++fa3fokAAv8RIIiLgMBAgCADHEsIEMQdQGAgQJABjiUECOIOIDAQIMgAxxICBHEHEBgIEGSAYwkBgrgDCAwECDLAsYQAQdwBBAYCBBngWEKAIO4AAgMBggxwLCFAEHcAgYEAQQY4lhAgiDuAwECAIAMcSwj8+nEEn58/fuQfHehf6/8Ik01rBHyCrPGy+zICBLmscOOuESDIGi+7LyNAkMsKN+4aAYKs8bL7MgIEuaxw464RIMgaL7svI0CQywo37hoBgqzxsvsyAgS5rHDjrhEgyBovuy8jQJDLCjfuGgGCrPGy+zICBLmscOOuESDIGi+7LyNAkMsKN+4aAYKs8bL7MgIEuaxw464RIMgaL7svI0CQywo37hoBgqzxsvsyAgS5rHDjrhEgyBovuy8jQJDLCjfuGgGCrPGy+zICBLmscOOuESDIGi+7LyNAkMsKN+4aAYKs8bL7MgI//3R3T1m/7AqdPa5PkLP7Nd2LBAjyIkAvP5sAQc7u13QvEiDIiwC9/GwCBDm7X9O9SIAgLwL08rMJEOTsfk33IgGCvAjQy88mQJCz+zXdiwR+/i/pLwba/fLPj7/zPe5fH1+7R3P+BgI+QTZAdeQ5BAhyTpcm2UCAIBugOvIcAgQ5p0uTbCBAkA1QHXkOAYKc06VJNhAgyAaojjyHAEHO6dIkGwgQZANUR55DgCDndGmSDQQIsgGqI88hQJBzujTJBgIE2QDVkecQIMg5XZpkAwGCbIDqyHMIEOScLk2ygQBBNkB15DkECHJOlybZQIAgG6A68hwCBDmnS5NsIECQDVAdeQ4BgpzTpUk2ECDIBqiOPIcAQc7p0iQbCBBkA1RHnkOAIOd0aZINBAiyAaojzyFAkHO6NMkGAgTZANWR5xC47ununrJ+zuV9YhKfIE9Q9h5vS4Agb1ud4E8QIMgTlL3H2xIgyNtWJ/gTBAjyBGXv8bYECPK21Qn+BAGCPEHZe7wtAYK8bXWCP0GAIE9Q9h5vS+C6v6TXm/r8O1/j/vHla9y/vRo+Qb7F4pcI/E+AIG4CAgMBggxwLCFAEHcAgYEAQQY4lhAgiDuAwECAIAMcSwgQxB1AYCBAkAGOJQQI4g4gMBAgyADHEgIEcQcQGAgQZIBjCQGCuAMIDAQIMsCxhABB3AEEBgIEGeBYQoAg7gACAwGCDHAsIUAQdwCBgQBBBjiWECCIO4DAQIAgAxxLCBDEHUBgIECQAY4lBAjiDiAwECDIAMcSAgRxBxAYCBBkgGMJAU93j90BT1lvFeITpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECBIkVIk6LAEFafUgTI0CQWCHitAgQpNWHNDECvwHnaxGSkEUPVAAAAABJRU5ErkJggg==

data:image/png;base64,...

Page 50: codebits 2009 HTML5 JS APIs

Canvas+

drawImage+

Video=

Page 51: codebits 2009 HTML5 JS APIs
Page 52: codebits 2009 HTML5 JS APIs
Page 53: codebits 2009 HTML5 JS APIs
Page 55: codebits 2009 HTML5 JS APIs

ctx.translate(canvas.width/2, canvas.height/2);ctx.scale(-1, 1);ctx.translate(-canvas.width/2, -canvas.height/2);

ctx.drawImage( video, 0, 0, video.width, video.height, 0, 0, canvas.width, canvas.height);

http://html5demos.com/video-canvas

Page 56: codebits 2009 HTML5 JS APIs

ctx.getImageData(0, 0, w, h);

Page 57: codebits 2009 HTML5 JS APIs

ctx.getImageData(0, 0, w, h);

0 1 2 3

0 r g b a

1 r g b a

... r g b a

Page 58: codebits 2009 HTML5 JS APIs

pixels.data[i * 4 + 0];

0 1 2 3

0 r g b a

1 r g b a

... r g b a

Page 59: codebits 2009 HTML5 JS APIs

pixels.data[i * 4 + 1];

0 1 2 3

0 r g b a

1 r g b a

... r g b a

Page 60: codebits 2009 HTML5 JS APIs

pixels.data[i * 4 + 2];

0 1 2 3

0 r g b a

1 r g b a

... r g b a

Page 61: codebits 2009 HTML5 JS APIs

pixels.data[i * 4 + 3];

0 1 2 3

0 r g b a

1 r g b a

... r g b a

Page 62: codebits 2009 HTML5 JS APIs

for (i = 0; i < pixels.data.length / 4; i++) { totals.r += pixels.data[i * 4 + 0]; // r totals.g += pixels.data[i * 4 + 1]; // g totals.b += pixels.data[i * 4 + 2]; // b}

var r = parseInt(totals.r / (w*h)), g = parseInt(totals.g / (w*h)), b = parseInt(totals.b / (w*h)), rgb = [r, g, b].join(',');

Page 63: codebits 2009 HTML5 JS APIs
Page 64: codebits 2009 HTML5 JS APIs

Don't use for evil

Page 65: codebits 2009 HTML5 JS APIs

Storage(supersized cookies)

Page 66: codebits 2009 HTML5 JS APIs

DatabaseStorage

Page 67: codebits 2009 HTML5 JS APIs

DatabaseStorage

Page 68: codebits 2009 HTML5 JS APIs

Storage

Page 69: codebits 2009 HTML5 JS APIs

Storage

sessionStorage

localStorage

window based

Page 70: codebits 2009 HTML5 JS APIs

Storage

sessionStorage

localStorage

window based

domain based

Page 71: codebits 2009 HTML5 JS APIs

Storage

var ss = sessionStorage;

ss.setItem('key', 12);

alert( ss.getItem('key') );

Page 72: codebits 2009 HTML5 JS APIs
Page 73: codebits 2009 HTML5 JS APIs

Storage

var ss = sessionStorage;

ss.setItem('key', 12);

alert( ss.getItem('key') );

Page 74: codebits 2009 HTML5 JS APIs

Storage

var ss = sessionStorage;

ss.key = 12;

alert( ss.key );

Page 75: codebits 2009 HTML5 JS APIs

Values set with expando syntax & that

overwrite methods: are removed on reload

Page 76: codebits 2009 HTML5 JS APIs

...but not removed using setItem

// Safari debugger broken:

ss.setItem('key', 12);

Page 77: codebits 2009 HTML5 JS APIs

Storage

• setItem(key, value)

• getItem(key)

• removeItem(key)

• key(index)

• clear()

Page 78: codebits 2009 HTML5 JS APIs

Values are strings

Work around: JSON(and http://www.json.org/json2.js)

Page 79: codebits 2009 HTML5 JS APIs

Tweet stream demo using

localStorage

Page 80: codebits 2009 HTML5 JS APIs
Page 81: codebits 2009 HTML5 JS APIs

Web Workers

Page 82: codebits 2009 HTML5 JS APIs

•"Threads"

•Native or via Gears

•Sandboxed

•Debugging can be tricky

Page 83: codebits 2009 HTML5 JS APIs
Page 84: codebits 2009 HTML5 JS APIs

http://html5demos.com/worker

Page 85: codebits 2009 HTML5 JS APIs

•importScripts

•postMessage

•onmessage

•onconnect

Page 86: codebits 2009 HTML5 JS APIs

var w = new Worker('worker.js');

w.onmessage = function (event) { alert("msg: " + event.data);};

w.postMessage('run');

app.html

Page 87: codebits 2009 HTML5 JS APIs

var w = new Worker('worker.js');

w.onmessage = function (event) { alert("msg: " + event.data);};

w.postMessage('run');

app.html

Page 88: codebits 2009 HTML5 JS APIs

var w = new Worker('worker.js');

w.onmessage = function (event) { alert("msg: " + event.data);};

w.postMessage('run');

app.html

Page 89: codebits 2009 HTML5 JS APIs

var w = new Worker('worker.js');

w.onmessage = function (event) { alert("msg: " + event.data);};

w.postMessage('run');

app.html

Page 90: codebits 2009 HTML5 JS APIs

onmessage = function (event) { if (event.data == 'run') { run(); }};

function run() { var data = doCrazyNumberCrunch(); postMessage(data);}

worker.js

Page 91: codebits 2009 HTML5 JS APIs

onmessage = function (event) { if (event.data == 'run') { run(); }};

function run() { var data = doCrazyNumberCrunch(); postMessage(data);}

worker.js

Page 92: codebits 2009 HTML5 JS APIs

onmessage = function (event) { if (event.data == 'run') { run(); }};

function run() { var data = doCrazyNumberCrunch(); postMessage(data);}

worker.js

Page 93: codebits 2009 HTML5 JS APIs

Can dos

•Spawn more workers

•setTimeout/Interval & clear

•Access navigator

•Error handling onerror

•XHR (though responseXML is null)

Page 94: codebits 2009 HTML5 JS APIs

8 workers Workers disabled

Page 95: codebits 2009 HTML5 JS APIs

Of!ine Applications

Page 96: codebits 2009 HTML5 JS APIs

Of!ine Applications

Page 97: codebits 2009 HTML5 JS APIs

Of!ine Apps

•Application cache / manifest

•Events: of!ine, online

•navigator.onLine property

Page 98: codebits 2009 HTML5 JS APIs

http://icanhaz.com/rubiks

Page 99: codebits 2009 HTML5 JS APIs

Using a Manifest

<!DOCTYPE html>

<html manifest="my.manifest">

<body>

<!-- my page -->

</body>

</html>

Page 100: codebits 2009 HTML5 JS APIs

CACHE MANIFEST

app.html

css/style.css

js/app.js

#version 13

my.manifest

Page 101: codebits 2009 HTML5 JS APIs

The Manifest

1. Serve as text/manifest, by adding to mime.types:

text/cache-manifest manifest

Page 102: codebits 2009 HTML5 JS APIs

The Manifest

2. First line must be:

CACHE MANIFEST

Page 103: codebits 2009 HTML5 JS APIs

The Manifest

3. Including page is implicitly included in the cache.

Page 104: codebits 2009 HTML5 JS APIs

The Manifest

4. Two futher namespaces: NETWORK & FALLBACK

FALLBACK:/ offline.html

Page 105: codebits 2009 HTML5 JS APIs

The Manifest

5. Include some versioning to cache bust your manifest

# version 16

Page 106: codebits 2009 HTML5 JS APIs

The process

Page 107: codebits 2009 HTML5 JS APIs

Browser: request Server: serve allBrowser: I have a manifest, cache

assets

Server: serve manifest assets

Browser: applicationCache

updatedBrowser: reload

Browser: serve locally

Browser: only request manifest

file

Server: 304 Not Modified

Page 108: codebits 2009 HTML5 JS APIs

Browser: request Server: serve allBrowser: I have a manifest, cache

assets

Server: serve manifest assets

Browser: applicationCache

updatedBrowser: reload

Browser: serve locally

Browser: only request manifest

file

Server: 304 Not Modified

Problem:Change of contentrequires 2 refreshes

Page 109: codebits 2009 HTML5 JS APIs

applicationCache.onUpdateReady = function () { applicationCache.swapCache(); notice('reload');};

window.onOnline = function () { // fire an update to the cache applicationCache.update();};

Page 110: codebits 2009 HTML5 JS APIs

And a

lotmore...

Page 111: codebits 2009 HTML5 JS APIs

Attributes: data-*, itemProp, sandbox (on iframes)

Microdata API, datagrid, XHR2 & upload progress

Drag & Drop, History manager ARIA overlap

querySelector

<progress><meter><datalist><ruby>

Page 113: codebits 2009 HTML5 JS APIs

RemySharp @rem

icnhz.com/rs_talksicnhz.com/rs_codebitshtml5demos.com

The Dizzy HTML5 cat