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>
placeholderautofocus<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 innerHTMLonchange events; use low-level events like onkeypress or oninputexecCommandFull 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')).widthgetElementsByClassName – 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