Victor Costan
Depending on who you ask, any of the following:
Let’s improve this form.
<form action="/register"> <dl> <dt><label for="email">Email</label></dt> <dd><input type="text" name="email" id="email" /></dd> <dt><label for="password">Password</label></dt> <dd><input type="password" name="password" id="password" /></dd> <dt><label for="confirm">Password Confirmation</label></dt> <dd><input type="password" name="confirm" id="confirm" /></dd> </dl> <p><input type="submit" value="Sign in" /></p> </form>
What’s better about this version?
<form action="/register"> <dl> <dt><label for="email">Email</label></dt> <dd><input type="email" name="email" id="email" /></dd> <dt><label for="password">Password</label></dt> <dd><input type="password" name="password" id="password" /></dd> <dt><label for="confirm">Password Confirmation</label></dt> <dd><input type="password" name="confirm" id="confirm" /></dd> </dl> <p><input type="submit" value="Sign in" /></p> </form>
Hint: imagine using it on an iPhone.
type="search" |
|
type="number" min="0" max="10" step="2" |
|
type="range" min="0" max="10" step="2" |
|
type="tel" |
|
type="url" |
|
type="email" |
|
type="date" |
|
type="time" |
placeholder
<form action="/register"> <dl> <dt><label for="email">Email</label></dt> <dd><input type="email" name="email" id="email" placeholder="we won't spam you" /></dd> <dt><label for="password">Password</label></dt> <dd><input type="password" name="password" id="password" placeholder="be clever" /></dd> <dt><label for="confirm">Password Confirmation</label></dt> <dd><input type="password" name="confirm" id="confirm" placeholder="say that again?" /></dd> </dl> <p><input type="submit" value="Sign in" /></p> </form>
placeholder
autofocus
<form action="/register"> <dl> <dt><label for="email">Email</label></dt> <dd><input type="email" name="email" id="email" placeholder="we won't spam you" autofocus="autofocus" /></dd> <dt><label for="password">Password</label></dt> <dd><input type="password" name="password" id="password" placeholder="be clever" /></dd> <dt><label for="confirm">Password Confirmation</label></dt> <dd><input type="password" name="confirm" id="confirm" placeholder="say that again?" /></dd> </dl> <p><input type="submit" value="Sign in" /></p> </form>
required
<form action="/register"> <dl> <dt><label for="email">Email</label></dt> <dd><input type="email" name="email" id="email" placeholder="we won't spam you" autofocus="autofocus" required="required"/></dd> <dt><label for="password">Password</label></dt> <dd><input type="password" name="password" id="password" placeholder="be clever" required="required" /> </dd> <dt><label for="confirm">Password Confirmation</label></dt> <dd><input type="password" name="confirm" id="confirm" placeholder="say that again?" required="required" /> </dd> </dl> <p><input type="submit" value="Sign in" /></p> </form>
pattern
<form action="/register"> <dl> <dt><label for="email">Email</label></dt> <dd><input type="email" name="email" id="email" pattern=".+@.+\..+" placeholder="we won't spam you" autofocus="autofocus" required="required"/></dd> <dt><label for="password">Password</label></dt> <dd><input type="password" name="password" id="password" placeholder="be clever" required="required"/></dd> <dt><label for="confirm">Password Confirmation</label></dt> <dd><input type="password" name="confirm" id="confirm" placeholder="say that again?" required="required" /> </dd> </dl> <p><input type="submit" value="Sign in" /></p> </form>
pattern
takes regular expressions.
<p>This is a paragraph.</p> <textarea name="email_body"> This is a lame text editor. </textarea> <p contentEditable="true" id="email_body"> This is a rich text editor. </p>
Sadly, contentEditable="true"
elements are not form fields.
value
property; use DOM properties like innerHTML
onchange
events; use low-level events like onkeypress
or oninput
execCommand
Full demo at quirksmode
<div id="header"> <div id="navigation"> ... </div> </div> <div id="footer"> ... </div>
<header> <nav> ... </nav> </header> <footer> ... </footer>
<article> |
<aside> |
<header> |
<hgroup> |
<footer> |
<section> |
<nav> |
<figure> |
<figcaption> |
<mark> |
<summary> |
<form action="/register" id="register_form" data-method="put"> <!-- truncated --> </form> <script type="text/javascript" src="data_attributes.js"> </script>
data-
prefix reserved for application-specific attributesdata-
attributes pass HTML5 validatorsdata-
values wrapped in dataset
DOM propertyvar methodValue = document.getElementById('register_form').dataset.method console.log(methodValue);
querySelectorAll
– all elements matching CSS selectorquerySelector
– first element matching CSS selectorgetComputedStyle
– computed CSS style properties, absolute metricsgetComputedStyle(document.querySelector('body')).width
getElementsByClassName
– self-explanatory; faster than querySelector
and querySelectorAll
(function() { var counter = localStorage.getItem("visit-counter") || "0"; counter = parseInt(counter) + 1; localStorage.setItem("visit-counter", counter); document.getElementById("counter").innerHTML = counter; })();
localStorage.getItem(key)
and localStorage.setItem(key, value)
Demo (only Chrome has local storage for files)
var onSuccess = function (position) { var coords = position.coords; var positionString = "at " + coords.latitude + ", " + coords.longitude; document.getElementById("location").innerHTML = positionString; } var onError = function (error) { alert(error); } navigator.geolocation.getCurrentPosition(onSuccess, onError);
Demo, or see a fancier one at HTML5demos
<!DOCTYPE html> <html manifest="/cache.manifest"> </html>
Serve the manifest as MIME type text/cache-manifest
CACHE MANIFEST # version 1295004505.312194 NETWORK: /tracking FALLBACK: / /offline.html CACHE: /stylesheets/all.css /javascripts/all.js
Events on window.applicationCache
<canvas>
(next lecture)Think elevators vs. escalators.
border-radius
.css3forms input[type=submit] { margin: 0; padding: 1px 6px; border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; box-shadow: 0px 1px 3px #EABA99; -moz-box-shadow: 0px 1px 3px #EABA99; -webkit-box-shadow: 0px 1px 3px #EABA99; background-color: #CA5200; border: 1px solid #983E00; color: #FFFFFF; font-size: 11pt; font-weight: bold; } .css3forms input[type=submit]:hover { color: #F4DCCC; } .css3forms input[type=submit]:active { background-color: #CA5200; box-shadow: inset 0px 2px 2px #983E00; -moz-box-shadow: inset 0px 2px 2px #983E00; -webkit-box-shadow: inset 0px 2px 2px #983E00; }
Victor Costan
Slides and Code
References