Alex Russell
Fronteers
Oct 7, 2011
https://www.flickr.com/photos/11304375@N07/2769553173
<a href="https://infrequently.org"> bloviating </a>
Value | Risk | Constituency |
---|---|---|
Ubiquity | Adoption | Developers |
Performance | Run-time | Users, Publishers |
High-level Semantics | Ecosystem lock-in | Users, Developers, Publishers |
Declarative Configuration | Technical lock-in | Designers, Publishers |
Extensibility | "Hard Wall" scenario | Developers, Publishers |
https://arstechnica.com/web/news/2011/09/august-browser-stats-mobile-safari-on-top.ars
https://arstechnica.com/web/news/2011/09/august-browser-stats-mobile-safari-on-top.ars
https://arstechnica.com/web/news/2011/09/august-browser-stats-mobile-safari-on-top.ars
https://infrequently.org/08/io/can_we_get_there.pdf
Coping Strategy | Constituency | Challenges |
---|---|---|
Widget Frameworks | Developers, Users | Dupliation, Semantics, Searchability, Interop, Performance |
JS Layout Managers | Developers, Users | Duplication, Semantics, Performance, Interop |
Ajax Data Management | Developers, Users | Duplication, Semantics, Searchability, Interop |
Microformats, etc. | Publishers, Search Engines, Developers | Browser Support, UI, Lingua-franca Status |
Chrome Frame | Publishers, Developers | Deployment, UX burden, Possibly "Managed Out" |
There is no Immaculate Connception for web standards.
Heuristics are rubbish because they are ambiguious.
<a href="https://infrequently.org"> some useless blog </a>
<input type="text" ...>
<input type="text" ...> <input type="date" ...> <input type="range" ...> <input type="email" ...> <input type="url" ...> <select> <textarea>
Are the semantics we have
the semantics we need?
https://www.flickr.com/photos/melbournewater/5834281031
https://www.flickr.com/photos/lodefink/891416169
<div class="commentTemplate"> <style scoped> img { border: 1px solid black; margin-bottom: 1em; float: left; } .text { margin-left: 71px; } .holder { clear: left; margin-bottom: 1em; } </style> <img class="avatar" alt="has a border"> <div class="text"></div> </div> <img alt="not affected by scoped rules!">
function Comment(text) { HTMLElement.call(this); // Makes this an Element this.textContent = text || '...'; this.buildUI(); } Comment.prototype = Object.create(HTMLElement.prototype); Comment.prototype.constructor = Comment; Comment.prototype.buildUI = function() { ... }; HTMLElement.register('x-comment', Comment);
var c = new Comment("Howdy, pardner!"); document.body.appendChild(c);
<x-comment>...</x-comment>
function Comment(text) { HTMLElement.call(this); // Makes this an Element this.textContent = text || '...'; this.shadow = new ShadowRoot(this); this.buildUI(); } Comment.prototype = Object.create(HTMLElement.prototype); Comment.prototype.constructor = Comment; Comment.prototype.buildUI = function() { ... }; HTMLElement.register('x-comment', Comment);
<template id="commentTemplate"> <div class="holder"> <style scoped> img { ... } .text { ... } .holder { ... } </style> <img class="avatar" alt="avatar"> <div class="text"> <content></content> </div> </div> </template>
<script> document.body.model = Model.get({ 'items': [ { 'name': 'Africa', 'children': [ { 'name': 'Egypt' }, { 'name': 'Kenya', 'children': [ { 'name': 'Nairobi' }, { 'name': 'Mombasa' } ] } ] } ] }); </script>
<template iterate="items" id="t"> <li>{{name}} <ul><template ref="t" iterate="children"></template></ul> </li> </template>
<html> <head> <datasource type="json" src="foo.json" id="dm"></datasource> ... </head> <body model="dm"> <template iterate="items" id="t"> <li>{{name}} <ul><template ref="t" iterate="children"></template></ul> </li> </template> </body> <html>
<html> <head> <datasource type="html" src="#listData" id="dm"></datasource> </head> <body model="dm"> <li id="listData"> <ul>...</ul> <ul>...</ul> </li> <template iterate="children"> <x-customview>{{nodeValue}}</x-customview> </template> </body> <html>
https://www.flickr.com/photos/futileboy/4855889430
function Comment(text) { HTMLElement.call(this); // Makes this an Element ... } Comment.prototype = Object.create(HTMLElement.prototype); Comment.prototype.constructor = Comment; Comment.prototype.buildUI = function() { ... }; HTMLElement.register('x-comment', Comment);
class Comment extends HTMLElement { constructor(attrs = {}) { super(attrs); this.textContent = attrs.text || lorem; this.shadow = new ShadowRoot(this); this.buildUI(); } buildUI() { ... } } HTMLElement.register('x-comment', Comment);
http://code.google.com/p/traceur-compiler
http://code.google.com/p/experimental-css
http://code.google.com/p/mdv
https://www.flickr.com/photos/mikechen-metalman/4394618656