These Aren't the Sites You're Looking For:
Modern Web Applications
-
These Aren't the Sites You're Looking For:
-


Media Queries for Style Sheets
<link rel="stylesheet" media="all" href="/static/css/base.min.css" /> <link rel="stylesheet" media="only screen and (max-width: 480px)" href="/static/css/mobile.min.css" />
Testing CSS media queries in JavaScript with window.matchMedia()
if (window.matchMedia('only screen and (max-width: 480px)').matches) {
// Asynchronously provide experience optimized for phone
} else if (window.matchMedia('only screen and (min-width: 481px) and ' +
'(max-width: 1024px)').matches) {
// Asynchronously provide experience optimized for table or smaller screen
} else {
// Asynchronously provide full screen experience
}
function updateHash(push) {
if (push) {
var slideNo = curSlide + 1;
var hash = '#' + slideNo;
window.history.pushState(slideNo, 'Slide ' + slideNo, hash);
}
}
window.addEventListener('popstate', handlePopState, false);
function handlePopState(event) {
if (event.state != null) {
curSlide = event.state - 1;
updateSlides(true);
}
}
<input type="file" id="dir-select" webkitdirectory />
document.querySelector('#dir-select').onchange = function(e) {
var out = [];
for (var i = 0, f; f = e.target.files[i]; ++i) {
out.push(f.webkitRelativePath);
}
document.querySelector('output').textContent = out.join('/n');
};
document.querySelector('#dropzone').
window.addEventListener('drop', function(e) {
var reader = new FileReader();
reader.onload = function(e) {
document.querySelector('img').src = e.target.result;
};
reader.readAsDataURL(e.dataTransfer.files[0]);
}, false);
document.body.onpaste = function(e) {
var items = e.clipboardData.items;
for (var i = 0; i < items.length; ++i) {
if (items[i].kind == 'file' && items[i].type == 'image/png') {
var blob = items[i].getAsFile();
var img = document.createElement('img');
img.src = window.URL.createObjectURL(blob);
document.body.appendChild(img);
}
}
};
Click in this window and paste and image ( Copy image from a right-click )
<a href="src/star.mp3" draggable="true" class="dragout" data-downloadurl="MIMETYPE:FILENAME:ABSOLUTE_URI_TO_FILE"> download </a>
var files = document.querySelectorAll('.dragout');
for (var i = 0, file; file = files[i]; ++i) {
file.addEventListener('dragstart', function(e) {
e.dataTransfer.setData('DownloadURL', this.dataset.downloadurl);
}, false);
}
( this feature is only available in Google Chrome )
window.webkitRequestFileSystem(TEMPORARY, 1024*1024, initFs, fsError);
function saveFile(arrayBuffer, filename, type, callback) {
fs.root.getFile(filename, {create: true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
var bb = new WebKitBlobBuilder();
bb.append(arrayBuffer);
fileWriter.write(bb.getBlob(type));
callback(fileEntry);
}, fsError);
}, fsError);
}
Application Cache to for static content:
<html manifest="cache.appcache">
Store data locally:
window.webkitRequestFileSystem(PERSISTENT, 1024*1024, initFs, fsError);
var idbRequest = window.indexedDB.open('Database Name');
window.localStorage.setItem('key', 'value');
Detect online/offline states:
window.addEventListener('online', function(e) {
// Re-sync stored data to server.
}, false);
var elems = document.querySelectorAll('textarea, input');
for (var i = 0, elem; elem = elems[i]; ++i) {
elem.addEventListener('input', function(item) {
localStorage[formName + '-' + item.srcElement.id] =
item.srcElement.value;
var debug = document.getElementById('data-persistence-debug');
debug.innerHTML = 'Last auto-saved at: ' + new Date();
}, false);
}
<input type="text" required />
<input type="email" value="some@email.com" />
<input type="date" min="2010-08-14" max="2011-08-14" value="2010-08-14"/>
<input type="range" min="0" max="50" value="10" />
<input type="search" results="10" placeholder="Search..." />
<input type="tel" placeholder="(555) 555-5555"
pattern="^\(?\d{3}\)?[-\s]\d{3}[-\s]\d{4}.*?$" />
<input type="color" placeholder="e.g. #bbbbbb" />
<input type="number" step="1" min="-5" max="10" value="0" />
<input type="text" x-webkit-speech />
function startSearch(e) {
if (e.target.results.length) {
var second = e.target.results[1].utterance;
document.getElementById('second_best').value = second;
}
e.target.form.submit();
}
window.notifications = window.notifications ||
window.webkitNotifications || window.mozNotifications;
function showNotifications(pic, title, text) {
if (notifications.checkPermission() == 0) {
return;
}
var note = notifications.createNotification(pic, title, text);
note.show();
setTimeout(function(note) { // close note after a timeout
note.cancel();
}, 6000, notification);
}
AppCache for faster initial load:
<html manifest="cache.appcache">
Store data locally:
window.webkitRequestFileSystem(TEMPORARY, 1024*1024, initFs, fsError);
var idbRequest = window.indexedDB.open('Database Name');
window.localStorage.setItem('key', 'value');
Animate with CSS3 instead of JS:
transition: all 1s ease-in-out;
Workers for non-blocking (responsive) UI:
var worker = new Worker('myworker.js');
More great tips at http://bit.ly/rizNVE

interface Shape {
perimeter(); // return type optional
}
class Rectangle implements Shape {
final num height, width;
// Compact constructor syntax
Rectangle(num this.height, num this.width);
// Terse function syntax
perimeter() => 2*height + 2*width;
}
class Square extends Rectangle {
Square(num size) : super(size, size);
}
main() {
var p = new Square(5).perimeter(); // dynamic type
print('Perimeter=$p'); // String interpolation
}
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
Play 23% more and spend 147% more
100% more engagement
{
"name": "My Chrome Web Store",
"description": "Discover great apps, games, extensions and...",
"version": "1.0",
"icons": {
"16": "16.png",
"128": "128.png"
},
"app": {
"urls": ["*://chrome.google.com/webstore"],
"launch": {
"web_url": "https://chrome.google.com/webstore"
}
},
"permissions": ["unlimitedStorage", "notifications",
"offline_enabled"]
}
In App Payments
Aim for a great experience, everything else will follow.