Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Moderne Web-Apps mit HTML5 und JavaScript

Moderne Web-Apps mit HTML5 und JavaScript

Thorsten Rinne

October 28, 2013
Tweet

More Decks by Thorsten Rinne

Other Decks in Technology

Transcript

  1. STRUKTUR • HTML (Templates) • CSS • LESS/SASS Quellen •

    JavaScript (Libraries und eigener Code) • Tests • Medien wie Bilder, Fonts, Audio, Video usw.
  2. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hallo, Berlin</title> </head> <body>

    <h1>Hallo, Berlin</h1> </body> </html> <meta charset="utf-8">
  3. JAVASCRIPT API • FullScreen API • Forms • Webworkers •

    Geolocation • Storage • Offline Application
  4. FULL SCREEN var elem = $('#content')[0]; if (elem.requestFullscreen) { elem.requestFullscreen();

    } else if (elem.mozRequestFullScreen) { elem.mozRequestFullScreen(); } else if (elem.webkitRequestFullscreen) { elem.webkitRequestFullscreen(); } go FullScreen
  5. FULL SCREEN if(document.cancelFullScreen) { document.cancelFullScreen(); } else if(document.mozCancelFullScreen) { document.mozCancelFullScreen();

    } else if(document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); } cancel FullScreen
  6. FULL SCREEN • Bitte mit Vorsicht verwenden • Styling für

    z.B. Hintergrund: • -webkit-full-screen • -moz-full-screen
  7. PROGRESS var interval = setInterval(function () { var progress =

    $('progress'); if (progress.val() < progress.attr('max')) { progress.val(progress.val() + 1); } else { clearInterval(interval); } }, 10);
  8. OUTPUT $('#output').on('input', function () { var nr1 = parseInt($('#nr1').val()); var

    nr2 = parseInt($('#nr2').val()); $('output').val(nr1 + nr2); }); Element zur Ausgabe von Berechnungen
  9. INPUT TYPES • Viele Aufgaben, die bisher mit JavaScript erledigt

    wurden, funktionieren jetzt mit HTML5 nativ • Können kaum angepasst werden
  10. INPUT TYPES • tel • search • url • email

    • date • month • week • time • number • range • color
  11. ATTRIBUTE • autofocus • placeholder • form • required •

    autocomplete • pattern • novalidate • formaction • formenctype • formmethod • formnovalidate • formtarget
  12. WEBWORKER • Workerthreads im Browser • Rechenintensive Prozesse auslagern •

    Zugriff auf: navigator, location, XMLHttpRequest,... • Kein Zugriff auf: DOM, window, document, parent
  13. WEBWORKER var i, n = 1, results = 1; outerLoop:

    while (true) { n += 1; for (i = 2; i <= Math.sqrt(n); i += 1) { if (n % i === 0) { continue outerLoop; } } self.postMessage(n); results += 1; if (results >= 1000) { self.close(); } }
  14. WEBSOCKETS • Bidirektionale Kommunikation zwischen Client und Server • Protokoll

    auf TCP-Basis • Eventbasiert • Sichere Variante wss://
  15. WEBSOCKETS var addr = 'ws://localhost:8181/'; var socket = new WebSocket(addr,

    'myapp'); $('#sayHello').on('click', function () { socket.send('Hello Server'); }); socket.onmessage = function (msg) { $('#response').html(msg.data); };
  16. WEBSOCKETS var WebSocketServer = require('websocket').server; var http = require('http'); var

    server = http.createServer().listen(8181); wsServer = new WebSocketServer({ httpServer: server, autoAcceptConnections: false }); wsServer.on('request', function(req) { var connection = req.accept('myapp', req.origin); connection.on('message', function(message) { connection.sendUTF("Hello Client!"); console.log(message.utf8Data); }); });
  17. GEOLOCATION var geolocation = navigator.geolocation; geolocation.getCurrentPosition(function (pos) { var posString

    = 'Lat: ' + pos.coords.latitude + ' Long: ' + pos.coords.longitude; $('#position').html(posString); });
  18. <!DOCTYPE html> <html> <head> </head> <link href="https://developers.google.com/maps/documentation/ javascript/examples/default.css" rel="stylesheet"> <script

    src="https://maps.googleapis.com/maps/api/ js?v=3.exp&sensor=false" /> <script src="/js/geolocation2.js" /> <body> <div id="map-canvas"></div> </body> </html>
  19. function initialize() { navigator.geolocation.getCurrentPosition(function (pos) { var myLatlng = new

    google.maps.LatLng(pos.coords.latitude, pos.coords.longitude); var mapOptions = { zoom: 4, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById('map- canvas'), mapOptions); var marker = new google.maps.Marker({ position: myLatlng, map: map, title: 'Hello World!' }); }); } google.maps.event.addDomListener(window, 'load', initialize);
  20. STORAGE • Local Storage - zeitlich unbegrenzt • Session Storage

    - nur für eine Browser-Session • IndexedDB • Web SQL
  21. <div> Items in Storage: &nbsp;<span id="itemCount"></span> </div> <table id="content"> <thead>

    <tr><th>key</th><th>value</th><th></th></tr> </thead> <tbody></tbody> </table> <div id="add"> <div> <label class="control-label">key:</label> <input id="storageKey"> </div> <div> <label class="control-label">value:</label> <input id="storageVal"> </div> <div> <button id="save">OK</button> </div> </div>
  22. var writeLine = function (k, v) { var line =

    '<tr><td>' + k + '</td><td>' + v + '</td><td><button data-value="' + k + '">delete' + '</button></td></tr>'; $('#content tbody').append(line); writeStorageLength(); }; for (var i = 0; i < localStorage.length; i++) { k = localStorage.key(i); v = localStorage.getItem(k); writeLine(k, v); }
  23. var writeStorageLength = function () { $('#itemCount').html(localStorage.length); }; $('#save').on('click', function

    () { var k = $('#storageKey').val(); var v = $('#storageVal').val(); localStorage.setItem(k, v); writeLine(k, v); }); $('#content').on('click', function (e) { localStorage.removeItem($(e.target).data('value')); $(e.target).closest('tr').remove(); writeStorageLength(); });
  24. OFFLINE APPLICATION • Dateien werden nur einmalig vom Server geholt

    • Manifestdatei enthält die Konfiguration
  25. OFFLINE APPLICATION Creating Application Cache with manifest http://localhost:8080/offline.manifest Application Cache

    Checking event Application Cache Downloading event Application Cache Progress event (0 of 7) http://localhost:8080/js/customers.js Application Cache Progress event (1 of 7) http://localhost:8080/css/bootstrap.css?v=1 Application Cache Progress event (2 of 7) http://localhost:8080/js/jquery.js Application Cache Progress event (3 of 7) http://localhost:8080/js/articles.js Application Cache Progress event (4 of 7) http://localhost:8080/index.html Application Cache Progress event (5 of 7) http://localhost:8080/js/init.js Application Cache Progress event (6 of 7) http://localhost:8080/js/orders.js Application Cache Progress event (7 of 7) Application Cache Cached event
  26. CSS LEVEL 3 • In der Entwicklung seit 2000 •

    Modularer Aufbau • Bekannte Module • Selectors Level 3 • Media Queries
  27. BOX SHADOW .shadow { -webkit-box-shadow: 2px 2px 2px 2px rgba(0,

    0, 0, 1); box-shadow: 2px 2px 2px 2px rgba(0, 0, 0, 1); }
  28. MEDIA QUERIES @media (min-width: 1200px) { ... } @media (min-width:

    768px) and (max-width: 979px) { ... } @media (max-width: 767px) { ... } @media (max-width: 480px) { ... }
  29. SELECTORS LEVEL3 • a[src^="https"] Jedes <a> Element, dessen src-Attribut mit

    https beginnt • a[src$=".pdf"] Jedes <a> Element, dessen src-Attribut mit .pdf endet • a[src*="jsdays"] Jedes <a> Element, dessen src-Attribut mit jsdays beinhaltet
  30. SELECTORS LEVEL3 • p:nth-child(2n) Jedes 2. <p> Element seines Elternelements

    • :root Das Rootelement eines Dokuments • :empty Jedes Element ohne Kindelemente
  31. SELECTORS LEVEL3 • input:enabled Jedes aktive <input> Element • input:disabled

    Jedes nicht aktive <input> Element • input:checked Jedes „ge-checkte“ <input> Element (Checkbox)
  32. OBJECT.* • Object.seal(obj)/Object.isSealed(obj) • Keine Änderungen mehr an Eigenschaften •

    Object.freeze(obj)/Object.isFrozen(obj) • Keine Schreibzugriffe mehr auf Eigenschaften + seal
  33. OBJECT.* • Object.defineProperty • set: magic setter function • get:

    magic getter function • value: default value • configurable: can be deleted • enumerable: can be iterated • writable: can be changed
  34. STRICT MODE MEHR FEHLER • Keine versehentlichen globals (ReferenceError) •

    Schärfere Regeln bei Zuweisungen • Non-writable, getter-only, neue Properties bei non-extensible Objekten • Kein Löschen von nicht löschbaren Eigenschaften (prototype) • Eindeutige Propertynamen • Eindeutige Namen für Argumente (function (a, a, b)...) • Keine Oktalnotation (z.B. 012 - SyntaxError)
  35. STRICT MODE EINFACHERE BENUTZUNG • “with” ist verboten • (var

    x = 1; with (obj) { x};) • Keine neuen Variablen mit “eval” • eval(“var x”); • Keine Variablen löschen • var x = 123; delete x;
  36. STRICT MODE EINFACHERE BENUTZUNG • “with” ist verboten • (var

    x = 1; with (obj) { x};) • Keine neuen Variablen mit “eval” • eval(“var x”); • Keine Variablen löschen • var x = 123; delete x;
  37. STRICT MODE EVAL & ARGUMENTS • eval und arguments können

    nicht mehr mit anderen Werten belegt oder an einen Kontext gebunden werden • arguments kann nicht mehr durch Aliases verändert werden • function func(arg) { var arg = 15; return [arg, arguments[0]]}; • arguments.callee existiert nicht mehr - TypeError
  38. STRICT MODE SICHERHEIT • Kein Zugriff mehr auf das globale

    Objekt aus Funktionen • function f() { return this; } - undefined • Kein Zugriff auf func.arguments und func.caller von außerhalb • Kein Zugriff auf Variablen in einer Funktion von außerhalb
  39. STRICT MODE • Reservierte Wörter: implements, interface, let, package, private,

    protected, public, static, und yield • Keine Funktionsdefinition in Bedingungen und Schleifen
  40. var express = require('express'); var app = express(); app.get('/', function

    (req, res) { res.send('Hello World'); }); app.listen(8080);
  41. MIDDLEWARE var dir = __dirname + ‘/images’ app.use(‘/images’, express.static(dir)); express.logger()

    Access Log auf der Konsole express.bodyParser() Zugriff auf req.body express.cookieParser() Cookies in Node.js express.cookieSession({secret: 'mySecret'}) Cookiebasierte Session req.session
  42. JADE - TEMPLATE ENGINE • Shortcuts - Attribute, Klassen, IDs

    • Platzhalter • Mixins • Includes • Extends
  43. SOCKET.IO var http = require('http'); var server = http.createServer(app); server.listen(8080);

    var io = require('socket.io').listen(server); io.sockets.on('connection', function (socket) { socket.on('msg', function(message) { console.log(message); }); });
  44. script(src="http://localhost:8080/ socket.io/socket.io.js") var socket = io.connect('http://localhost: 8080'); $('#chat').on('submit', function (e)

    { e.preventDefault(); var value = $('#message').val(); $('#message').val(''); $('#message').focus(); $('#messages').append(value + '<br />'); socket.emit('msg', value); return false; });
  45. BOWER • bower search <package> • bower install <package>[#<version>] •

    --save -> Installation + bower.json • bower update • bower uninstall <package> • bower list • bower lookup <package>
  46. BOOTSTRAP • Scaffolding (Grid, Layout, Responsive) • Base CSS (Buttons,

    Forms, Tables) • Components (Navigation, Alerts, Pagination) • JavaScript (Modal, Tooltip)
  47. LESS - NESTED RULES #head { background-color: @dark; height:25px; div

    { color: @light; background-color: @dark; &:hover { background-color: @light; color: @dark; } } }
  48. LESS - MIXINS .rounded-corners (@radius: 10px;) { -webkit-border-radius: @radius; -moz-border-radius:

    @radius; border-radius: @radius; } #info { .rounded-corners(5px); width: 250px; margin: 10px; padding-left: 5px; background-color: lightgreen; }
  49. FRAMEWORKS • Bootstrap • Foundation v3 • Foundation v4 •

    Skeleton • 960.gs • http://responsive.vermilion.com/compare.php
  50. KONTAKT Sebastian Springer sebastian.springer@mayflower.de Mayflower GmbH Mannhardtstr. 6 80538 München

    Deutschland @basti_springer https://github.com/sspringer82 Thorsten Rinne [email protected] Yatego GmbH Kobellstr. 15 80336 München Deutschland @ThorstenRinne https://github.com/thorsten