SlideShare a Scribd company logo
HTML5 APIs -
Where No Man Has
  Gone Before!
HTML5 workshop, part 2
classList
var elm = document.getElementById("classlist-demo");
elm.classList.add("boxy");
elm.classList.add("pretty");
elm.classList.remove("pretty");
elm.classList.toggle("pretty");
elm.classList.contains("pretty");
elm.classList.toString();
Custom data attributes
<p data-type="police" data-value="I am da law!">
     An element with custom data attributes
</p>
var customAttributes = document.getElementById("custom-attributes");
customAttributes.getAttribute("data-type");
customAttributes.getAttribute("data-value");
customAttributes.dataset.type;
var dataset = [];
for (var i in customAttributes.dataset) {
    dataset.push(i + ": " + customAttributes.dataset[i]);
}
Video
HTML5 workshop, part 2
HTML5 workshop, part 2
// Methods
video.canPlayType();
video.load();
video.pause();
video.play();
// Properties
video.paused;
video.muted;
video.autobuffer;
video.autoplay;
video.buffered; (Unimplemented)
video.bufferedBytes; (Unimplemented)
video.bufferingRate; (Unimplemented)
video.bufferingThrottled; (Unimplemented)
video.controls;
video.currentSrc;
video.currentTime;
video.defaultPlaybackRate;
video.duration;
video.ended;
video.error;
video.muted;
video.networkState;
video.paused;
video.playbackRate;
video.readyState;
video.seeking;
video.src;
video.totalBytes;
video.volume;
// Events
video.abort;
video.canplay;
video.canplaythrough;
video.canshowcurrentframe;
video.dataunavailable;
video.durationchange;
video.emptied;
video.empty;
video.ended;
video.error;
video.loadedfirstframe;
video.loadedmetadata;
video.loadstart;
video.pause;
video.play;
video.progress; (lengthComputable, loaded, total)
video.ratechange;
video.seeked;
video.seeking;
video.suspend;
video.timeupdate;
video.volumechange;
Canvas
<canvas id="my-canvas" width="500" height="500">
    I am canvas
</canvas>
var canvas = document.getElementById("my-canvas"),
    context = canvas.getContext("2d");

context.fillStyle = "#f00";
context.fillRect(0, 0, 100, 100);
context.save();

context.fillStyle = "rgba(0, 0, 200, 0.5)";
context.fillRect(50, 50, 100, 100);

context.clearRect(40, 40, 20, 20);

context.restore();
HTML5 workshop, part 2
context.fillRect(350, 50, 100, 100);

context.lineWidth = "10";
context.lineJoin = "round";

context.moveTo(50, 50);
context.lineTo(200, 200);
context.lineTo(100, 300);
context.closePath();
context.stroke();
context.fill();

context.beginPath();
context.strokeStyle = "#00f";
context.arc(200, 400, 75, 0, Math.PI*2, false);

context.stroke();
HTML5 workshop, part 2
HTML5 workshop, part 2
context.fillStyle = "#fff";
context.fillRect(0, 0, 200, 200);

context.fillStyle = "#f00";
context.fillRect(0, 0, 100, 100);

context.fillRect(100, 100, 100, 100);
HTML5 workshop, part 2
context.strokeStyle = "transparent";

context.arc(100, 100, 75, 0, Math.PI*2, false);
context.clip();
context.stroke();

context.fillStyle = "#fff";
context.fillRect(0, 0, 200, 200);

context.fillStyle = "#f00";
context.fillRect(0, 0, 100, 100);

context.fillRect(100, 100, 100, 100);
HTML5 workshop, part 2
var canvas = document.getElementById("my-canvas"),
    context = canvas.getContext("2d"),
    img = document.createElement("img");

img.addEventListener("load", function () {
    context.drawImage(img, 0, 0, 600, 200);
    // Get canvas content as a base64 image
    var base64Img = canvas.toDataURL("image/png");
}, false);

img.setAttribute("src", "view.jpg");
data:image/png;base64,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
HTML5 workshop, part 2
pdf.js
Web Storage
HTML5 workshop, part 2
sessionStorage.setItem("Charming", "Anthony Weiner");
console.log(sessionStorage.getItem("Charming"));
localStorage.setItem("Occupation", "Politician");
var anthonyWeiner = {
    "Interest" : "Photography",
    "Social" : "Twitter"
};

localStorage.setItem("anthonyWeiner", JSON.stringify(anthonyWeiner));

console.log(typeof JSON.parse(localStorage.getItem("anthonyWeiner")));
Web SQL   IndexedDB
IndexedDB
var indexedDB = window.indexedDB || window.webkitIndexedDB
|| window.mozIndexedDB || window.msIndexedDB;

var request = indexedDB.open("ABBADatabase");
var request = indexedDB.open("ABBADatabase", 2),
    customerData = [
        {ssn: "444-44-4444", name: "Bill", age: 35, email: "bill@company.com"},
        {ssn: "555-55-5555", name: "Donna", age: 32, email: "donna@home.org"}
    ];

request.onerror = function(event) {
    // Handle errors.
};

request.onupgradeneeded = function (event) {
    var objectStore = db.createObjectStore("customers", {
        keyPath: "ssn"}
    );

     objectStore.createIndex("name", "name", {
         unique: false
     });

     objectStore.createIndex("email", "email", {
         unique: true }
     );

     for (var i in customerData) {
         objectStore.add(customerData[i]);
     }
};
Offline Web Applications
if (window.addEventListener) {
    /*
        Works well in Firefox and Opera with the
        Work Offline option in the File menu.
        Pulling the ethernet cable doesn't seem to trigger it
    */
    window.addEventListener("online", isOnline, false);
    window.addEventListener("offline", isOffline, false);
}
else {
    /*
        Works in IE with the Work Offline option in the
        File menu and pulling the ethernet cable
    */
    document.body.ononline = isOnline;
    document.body.onoffline = isOffline;
}
// Poll the navigator.onLine property
setInterval(function () {
    console.log(navigator.onLine);
}, 1000);
<!DOCTYPE html>
<html manifest="offline.appcache">
<head>
...
HTML5 workshop, part 2
CACHE MANIFEST

# VERSION 10

CACHE:
offline.html
base.css

FALLBACK:
online.css offline.css

NETWORK:
/live-updates
Geolocation
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {
        alert(position.coords.latitude + ", " + position.coords.longitude);
    });
}
HTML5 workshop, part 2
HTML5 workshop, part 2
HTML5 workshop, part 2
History API
window.history.pushState(state, title, url);
var url = "http://robertnyman.com",
title = "My blog",
state = {
    address : url
};

window.history.pushState(state, title, url);
HTML5 workshop, part 2
Web Sockets
LiveConnect
    Forever Frame



      HTTP Long-Polling and XHR Streaming




    What came before WebSockets?

      AJAX
                                            HTTP Polling



Cross Frame Communication
var ws = new WebSocket("ws://robertnyman.com/wsmagic");

// Send data
ws.send("Some data");

// Close the connection
ws.close();
var ws = new WebSocket("ws://robertnyman.com/wsmagic");

// When connection is opened
ws.onopen = function () {
    console.log("Connection opened!");
};

// When you receive a message
ws.onmessage = function (evt) {
    console.log(evt.data);
};

// When you close the connection
ws.onclose = function () {
    console.log("Connection closed");
};

// When an error occurred
ws.onerror = function () {
    console.log("An error occurred");
};
web-socket-js
 Socket.IO
File API

<input id="files-upload" type="file" multiple>
var filesUpload = document.getElementById("files-upload");
filesUpload.onchange = function () {
    // Access to data about all files
    var files = this.files,
        file;
    for (var i=0, l=files.length; i<l; i++) {
        file = file[i];
        file.name; // Get the name of the file
        file.size; // Get the size of the file, in bytes
        file.type; // Get the type of the file
    };
};
for (var i=0, l=files.length, file, img; i<l; i++) {
    file = files[i];

    if (typeof FileReader !== "undefined") {
        img = document.createElement("img");
        reader = new FileReader();
        reader.onload = (function (theImg) {
            return function (evt) {
                 theImg.src = evt.target.result;
            };
        }(img));
        reader.readAsDataURL(file);
    }
}
// For Firefox, Google Chrome and Safari
var xhr = new XMLHttpRequest();
xhr.open("post", "upload/upload.php", true);
xhr.onreadystatechange = function() {
   if (this.readyState === 4) {
         // File uploaded
     }
};

// Upload file: Firefox, Google Chrome and Safari
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.setRequestHeader("X-File-Name", file.fileName);
xhr.setRequestHeader("X-File-Size", file.fileSize);
xhr.setRequestHeader("X-File-Type", file.type);

xhr.send(file);
Drag and Drop
...I am forced to conclude that
the HTML5 drag and drop
module is not just a disaster, it’s
a fucking disaster.

                       -Peter-Paul Koch
<div id="can-be-dragged" draggable></div>
<p id="drop-area">
     Drag and drop files here
</p>
var someImg = document.getElementById("some-image"),
    dropArea = document.getElementById("drop-area");

someImg.ondragstart = function (evt) {
    var event = evt || window.event;
    event.dataTransfer.setData("Text", this.getAttribute("alt"));
    return false;
};

dropArea.ondragenter = function (evt) {
    return false;                          “If the drop is to be
};
                                            accepted, then this
dropArea.ondragover = function (evt) {
    return false;                          event (dragover) has
};
                                             to be canceled.”
dropArea.ondrop = function (evt) {
    var text = event.dataTransfer.getData("Text");
    event.cancelBubble = true; // For IE
    return false;
};
someImg.ondragstart = function (evt) {
    var event = evt || window.event;
    event.dataTransfer.setDragImage(dragIcon, -10, -10);
    return false;
};
Web Workers
var worker = new Worker("worker.js");
// Main page code
    var worker = new Worker("worker.js");

    // postMessage
    worker.postMessage(5);

    // Receive message back from Worker
    worker.onmessage = function (evt) {
        document.getElementById("worker-results").innerHTML
= evt.data;
    };

    // Error handling
    worker.onerror = function (evt) {
        document.getElementById("worker-results").innerHTML
= "An error occurred";
    };
// Web Worker code
onmessage = function (evt) {
    for (var i=evt.data, il=1000001; i<il; i++) {
        postMessage(i);
    };
};
Fullscreen
<button id="view-fullscreen">Fullscreen</button>

<script type="text/javascript">
(function () {
    var viewFullScreen = document.getElementById("view-fullscreen");
    if (viewFullScreen) {
        viewFullScreen.addEventListener("click", function () {
            var docElm = document.documentElement;
            if (docElm.mozRequestFullScreen) {
                docElm.mozRequestFullScreen();
            }
            else if (docElm.webkitRequestFullScreen) {
                docElm.webkitRequestFullScreen();
            }
        }, false);
    }
})();
 </script>
mozRequestFullScreenWithKeys?
html:-moz-full-screen {
    background: red;
}

html:-webkit-full-screen {
    background: red;
}
HTML5 workshop, part 2
HTML5 workshop, part 2
Battery
// Get battery level in percentage
var batteryLevel = battery.level * 100 + "%";

// Get whether device is charging or not
var chargingStatus = battery.charging;

// Time until the device is fully charged
var batteryCharged = battery.chargingTime;

// Time until the device is discharged
var batteryDischarged = battery.dischargingTime;
battery.addEventLister("levelchange", function () {
    // Device's battery level changed
}, false);

battery.addEventListener("chargingchange", function () {
    // Device got plugged in to power, or unplugged
}, false);

battery.addEventListener("chargingtimechange", function () {
    // Device's charging time changed
}, false);

battery.addEventListener("dischargingtimechange", function () {
    // Device's discharging time changed
}, false);
Vibration
(function () {
    document.querySelector("#vibrate-one-second").addEventListener("click",
        function () {
            navigator.mozVibrate(1000);
        }, false);

    document.querySelector("#vibrate-twice").addEventListener("click",
        function () {
            navigator.mozVibrate([200, 100, 200, 100]);
        }, false);



    document.querySelector("#vibrate-long-time").addEventListener("click",
        function () {
            navigator.mozVibrate(5000);
        }, false);

    document.querySelector("#vibrate-off").addEventListener("click",
        function () {
            navigator.mozVibrate(0);
        }, false);
})();
WebGL
HTML5 workshop, part 2
HTML5 workshop, part 2
HTML5 workshop, part 2
HTML5 workshop, part 2
squareVertexPositionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
vertices = [
     1.0, 1.0, 0.0,
    -1.0, 1.0, 0.0,
     1.0, -1.0, 0.0,
    -1.0, -1.0, 0.0
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
squareVertexPositionBuffer.itemSize = 3;
squareVertexPositionBuffer.numItems = 4;
}
var teapotPositions = new Float32Array([ 17.83489990234375, 0, 30.573999404907227,
16.452699661254883, -7.000179767608643, 30.573999404907227, 16.223100662231445,
-6.902520179748535, 31.51460075378418, 17.586000442504883, 0, 31.51460075378418,
16.48940086364746, -7.015810012817383, 31.828100204467773, 17.87470054626465, 0,
31.828100204467773, 17.031099319458008, -7.246280193328857, 31.51460075378418,
18.46190071105957, 0, 31.51460075378418, 17.62779998779297, -7.500199794769287,
30.573999404907227, 19.108800888061523, 0, 30.573999404907227, 12.662699699401855,
-12.662699699401855, 30.573999404907227, 12.486100196838379, -12.486100196838379,
31.51460075378418, 12.690999984741211, -12.690999984741211, 31.828100204467773,
13.10789966583252, -13.10789966583252, 31.51460075378418, 13.56719970703125,
-13.56719970703125, 30.573999404907227, 7.000179767608643, -16.452699661254883,
30.573999404907227, 6.902520179748535, -16.223100662231445, 31.51460075378418,
7.015810012817383, -16.48940086364746, 31.828100204467773, 7.246280193328857,
-17.031099319458008, 31.51460075378418, 7.500199794769287, -17.62779998779297,
30.573999404907227, 0, -17.83489990234375, 30.573999404907227, 0, -17.586000442504883,
31.51460075378418, 0, -17.87470054626465, 31.828100204467773, 0, -18.46190071105957,
31.51460075378418, 0, -19.108800888061523, 30.573999404907227, 0, -17.83489990234375,
30.573999404907227, -7.483870029449463, -16.452699661254883, 30.573999404907227,
-7.106579780578613, -16.223100662231445, 31.51460075378418, 0, -17.586000442504883,
31.51460075378418, -7.07627010345459, -16.48940086364746, 31.828100204467773, 0,
-17.87470054626465, 31.828100204467773, -7.25383996963501, -17.031099319458008,
31.51460075378418, 0, -18.46190071105957, 31.51460075378418, -7.500199794769287,
-17.62779998779297, 30.573999404907227, 0, -19.108800888061523, 30.573999404907227,
-13.092700004577637, -12.662699699401855, 30.573999404907227, -12.667499542236328,
-12.486100196838379, 31.51460075378418, -12.744799613952637, -12.690999984741211,
31.828100204467773, -13.11460018157959, -13.10789966583252, 31.51460075378418,
-13.56719970703125, -13.56719970703125, 30.573999404907227, -16.61389923095703,
-7.000179767608643, 30.573999404907227, -16.291099548339844, -6.902520179748535,
31.51460075378418, -16.50950050354004, -7.015810012817383, 31.828100204467773,
-17.033599853515625, -7.246280193328857, 31.51460075378418, -17.62779998779297,
-7.500199794769287, 30.573999404907227, -17.83489990234375, 0, 30.573999404907227,
-17.586000442504883, 0, 31.51460075378418, -17.87470054626465, 0, 31.828100204467773,
-18.46190071105957, 0, 31.51460075378418, -19.108800888061523, 0, 30.573999404907227,
-17.83489990234375, 0, 30.573999404907227, -16.452699661254883, 7.000179767608643,
HTML5 workshop, part 2
HTML5 workshop, part 2
Try new things
HTML5 workshop, part 2
HTML5 workshop, part 2
HTML5 workshop, part 2
Robert Nyman
robertnyman.com/speaking/ robnyman@mozilla.com
robertnyman.com/html5/    Twitter: @robertnyman
robertnyman.com/css3/

More Related Content

HTML5 workshop, part 2