HTML5 JavaScript APIs

101
APIs HTML5 HTML5 JavaScript APIs jsconf.eu 2009

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 behind the new JavaScript APIs, and explore where these features can be used

Transcript of HTML5 JavaScript APIs

Page 1: HTML5 JavaScript APIs

APIs

HTML5

HTML5 JavaScript APIsjsconf.eu 2009

Page 2: HTML5 JavaScript APIs

2022

Page 3: HTML5 JavaScript APIs

2022 = two completely interoperable

implementations

Page 4: HTML5 JavaScript APIs

CSS 2.1

Page 5: HTML5 JavaScript APIs

HTML5

Page 6: HTML5 JavaScript APIs

Web Forms

Audio/Video

Canvas

Offline

Drag & Drop

Editable

History API

Undo

X-Domain

Messaging

HTML5

Page 7: HTML5 JavaScript APIs

“HTML5”

Page 8: HTML5 JavaScript APIs

“HTML5”

•Web Forms 2.0

•Audio & Video

•Canvas

•Offline

•Storage

•Geolocation

•Workers

Page 9: HTML5 JavaScript APIs

“HTML5”

•Web Forms 2.0

•Audio & Video

•Canvas

•Offline

•Storage

•Geolocation

•Workers

Page 10: HTML5 JavaScript APIs

“HTML5”

•Web Forms 2.0

•Audio & Video

•Canvas

•Offline

•Storage

•Geolocation

•Workers

Page 11: HTML5 JavaScript APIs

Web Forms 2.0

Actual search for "web forms", wtf? http://tr.im/webforms_pic ➙

Page 12: HTML5 JavaScript APIs

"JavaScript is only good for image roll overs &

form validation"

Page 13: HTML5 JavaScript APIs

"JavaScript is only good for image roll overs &

form validation"

:hover

Page 14: HTML5 JavaScript APIs

"JavaScript is only good for image roll overs &

form validation"

.hasFeature('WebForms', '2.0')

Page 15: HTML5 JavaScript APIs

"JavaScript is only good for image roll overs &

form validation"awesome shit"

.hasFeature('WebForms', '2.0')

Page 16: HTML5 JavaScript APIs
Page 17: HTML5 JavaScript APIs

var f = document.querySelector('form');f.onsubmit = function () { if ( this.checkValidity() ) { alert("It's all okay"); } else { alert("Something's gone wrong..."); return false; }};

Page 18: HTML5 JavaScript APIs

Less JavaScript on donkey work

== more JavaScript

on awesome work.

Page 19: HTML5 JavaScript APIs
Page 20: HTML5 JavaScript APIs
Page 21: HTML5 JavaScript APIs

Native MediaElements

Page 22: HTML5 JavaScript 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 23: HTML5 JavaScript APIs

<video src="dizzy.ogv" />

Page 24: HTML5 JavaScript APIs
Page 25: HTML5 JavaScript APIs

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

Page 26: HTML5 JavaScript APIs

?

Page 27: HTML5 JavaScript APIs

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

Page 28: HTML5 JavaScript APIs

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

Page 29: HTML5 JavaScript APIs

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

Page 30: HTML5 JavaScript APIs

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

Page 31: HTML5 JavaScript APIs
Page 32: HTML5 JavaScript APIs

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

Page 33: HTML5 JavaScript APIs

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

Page 34: HTML5 JavaScript APIs

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

Page 35: HTML5 JavaScript APIs

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

Page 36: HTML5 JavaScript APIs

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

Page 37: HTML5 JavaScript APIs

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

Page 38: HTML5 JavaScript APIs

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

Page 39: HTML5 JavaScript APIs

•play(), pause()

•paused, ended, currentTime

•canplay, timeupdate, ended

•and a bunch more.

Page 40: HTML5 JavaScript APIs

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

•Firefox needs the right content-type

•Safari will plough ahead

Page 41: HTML5 JavaScript APIs

Accessibility?

Page 43: HTML5 JavaScript APIs

Canvas(+ excanvas.js)

Page 44: HTML5 JavaScript APIs
Page 45: HTML5 JavaScript APIs
Page 46: HTML5 JavaScript APIs

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

Page 47: HTML5 JavaScript APIs

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

Page 48: HTML5 JavaScript APIs

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

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

Page 49: HTML5 JavaScript 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 50: HTML5 JavaScript 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 51: HTML5 JavaScript 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 52: HTML5 JavaScript APIs
Page 53: HTML5 JavaScript APIs

ctx.toDataURL("image/png");

Page 54: HTML5 JavaScript APIs

ctx.toDataURL("image/png");data:image/png;base64,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

data:image/png;base64,...

Page 55: HTML5 JavaScript APIs

Canvas+

drawImage+

Video=

Page 56: HTML5 JavaScript APIs
Page 57: HTML5 JavaScript APIs
Page 58: HTML5 JavaScript APIs
Page 59: HTML5 JavaScript APIs

ctx.getImageData()

http://blog.mozbox.org/post/2009/04/12/Firefox-35%3A-a-new-experiment-with-Canvas-Video

Page 60: HTML5 JavaScript APIs

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

i = 0; // or via loop

r = frame.data[i + 0];

g = frame.data[i + 1];

b = frame.data[i + 2];

Page 61: HTML5 JavaScript 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);

Page 62: HTML5 JavaScript APIs

Don't use for evil

Page 63: HTML5 JavaScript APIs

Of!ine Applications

Page 64: HTML5 JavaScript APIs

Of!ine Applications

Page 65: HTML5 JavaScript APIs

Of!ine Apps

•Application cache

•Events: of!ine, online

•navigator.onLine property

Page 66: HTML5 JavaScript APIs

http://icanhaz.com/rubiks

Page 67: HTML5 JavaScript APIs

Enable

<!DOCTYPE html>

<html manifest="my.manifest">

<body>

<!-- my page -->

</body>

</html>

Page 68: HTML5 JavaScript APIs

CACHE MANIFEST

images/shade.jpg

images/bin.jpg

#version 13

my.manifest

Page 69: HTML5 JavaScript APIs

Cache

•First line: CACHE MANIFEST

•Requires text/cache-manifest

•Recommend using versioning

•window.applicationCache

•Add it last!

Page 70: HTML5 JavaScript APIs

The process

Page 71: HTML5 JavaScript APIs

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

assets

Server: serve manifest assets

Browser: applicationCache

updatedBrowser: reload

Browser: only request manifest

file

Server: 304 Not Modified

Browser: serve locally

Page 72: HTML5 JavaScript APIs

Storage(giant cookies)

Page 73: HTML5 JavaScript APIs

SQLitekey/val

Page 74: HTML5 JavaScript APIs

key/value

sessionStorage

localStorage

.setItem(key, value);

.getItem(key);

window based

Page 75: HTML5 JavaScript APIs

key/value

sessionStorage

localStorage

.setItem(key, value);

.getItem(key);

window based

domain based

Page 76: HTML5 JavaScript APIs
Page 77: HTML5 JavaScript APIs

SQLite"User agents must

implement the SQL dialect supported by Sqlite 3.6.19"

Another one that fails super silently :(

Page 78: HTML5 JavaScript APIs

db = openDatabase("demo", "1.0",

"sample", 200000);

db.transaction(function (tx) {

tx.executeSql('SELECT * FROM tweets

WHERE mention = ?', [mention], function

(tx, results) {

// do something with results

});

});

Page 79: HTML5 JavaScript APIs

db = openDatabase("demo", "1.0",

"sample", 200000);

db.transaction(function (tx) {

tx.executeSql('SELECT * FROM tweets

WHERE mention = ?', [mention], function

(tx, results) {

// do something with results

});

});

Page 80: HTML5 JavaScript APIs

db = openDatabase("demo", "1.0",

"sample", 200000);

db.transaction(function (tx) {

tx.executeSql('SELECT * FROM tweets

WHERE mention = ?', [mention], function

(tx, results) {

// do something with results

});

});

Page 81: HTML5 JavaScript APIs

db = openDatabase("demo", "1.0",

"sample", 200000);

db.transaction(function (tx) {

tx.executeSql('SELECT * FROM tweets

WHERE mention = ?', [mention], function

(tx, results) {

// do something with results

});

});

Page 82: HTML5 JavaScript APIs
Page 83: HTML5 JavaScript APIs

Geolocation

Page 84: HTML5 JavaScript APIs

Geolocation

Page 85: HTML5 JavaScript APIs
Page 86: HTML5 JavaScript APIs

Not always accurate!

Page 87: HTML5 JavaScript APIs

navigator .geolocation .getCurrentPosition( success, err );

Page 88: HTML5 JavaScript APIs
Page 89: HTML5 JavaScript APIs

Web Workers

Page 90: HTML5 JavaScript APIs

•"Threads"

•Native or via Gears (or setTimeout hack?)

•Sandboxed

•Debugging?

Page 91: HTML5 JavaScript APIs
Page 92: HTML5 JavaScript APIs

http://html5demos.com/worker

Page 93: HTML5 JavaScript APIs

•importScripts

•postMessage

•onmessage

•onconnect

Page 94: HTML5 JavaScript APIs

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

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

w.postMessage('run');

app.html

Page 95: HTML5 JavaScript APIs

importScripts('xhr.js', 'db.js');

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

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

worker.js

Page 96: HTML5 JavaScript APIs

importScripts('xhr.js', 'db.js');

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

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

worker.js

Page 97: HTML5 JavaScript APIs

importScripts('xhr.js', 'db.js');

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

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

worker.js

Page 98: HTML5 JavaScript APIs

And a

lotmore...

Page 99: HTML5 JavaScript 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 101: HTML5 JavaScript APIs

RemySharp @rem

JavaScript Conference:

full-frontal.org

http://html5demos.com

Links: http://tr.im/rs_jsconfeu

(another)

Pro tip: cats can't code for crap