HTML5
HTML5
HTML5
HTML5
ARKAITZ GARRO
CAPTULO 1
QU ES HTML5?
Especificacin oficial
5 Tips
CAPTULO 2
SEMNTICA
Cabecera del documento
Nuevas etiquetas semnticas
Estructura de un documento HTML5
Uso de las nuevas etiquetas semnticas
Atributos globales
CAPTULO 3
ELEMENTOS DE FORMULARIO
Nuevos tipos de input
Nuevos atributos
Nuevos elementos
CAPTULO 4
QU ES MODERNIZR
Aadir Modernizr a una pgina
Objeto Modernizr
Clases CSS en Modernizr
El mtodo load()
CAPTULO 5
DATASET
CAPTULO 6
MULTIMEDIA
Vdeo
Codecs, la nueva guerra
API multimedia
Fullscreen video
Audio
CAPTULO 7
CANVAS
http://www.arkaitzgarro.com/html5/[13/07/2015 12:26:10]
CAPTULO 10
CAPTULO 11
GEOLOCALIZACIN
11.1 Mtodos del API
CAPTULO 12
WEB WORKERS
12.1 Transferencia de mensajes
12.2 Utilizacin de Web Workers
12.3 Subworkers
12.4 Gestionar errores
12.5 Seguridad
CAPTULO 13
WEBSOCKETS
13.1 Introduccin
13.2 Crear un WebSocket
13.3 Comunicacin con el servidor
13.4 WebSocket en el servidor
CAPTULO 14
EVENTSOURCE
14.1 EventSource en el servidor
CAPTULO 15
FILE
CAPTULO 16
HISTORY
16.1 API
CAPTULO 17
XMLHTTPREQUEST2
Elementos bsicos
Dibujar formas
Rutas
Colores
Degradados y patrones
Transparencias
Transformaciones
Animaciones
CAPTULO 8
ALMACENAMIENTO LOCAL
CAPTULO 18
EJERCICIOS
18.1 Captulo 2
18.2 Captulo 3
Web Storage
18.3 Captulo 4
Web SQL
18.4 Captulo 5
IndexedDB
18.5 Captulo 6
CAPTULO 9
SIN CONEXIN
18.6 Captulo 7
18.7 Captulo 8
18.8 Captulo 9
18.9 Captulo 10
Proceso de cacheado
18.10Captulo 11
18.11Captulo 12
Eventos online/offline
18.12Captulo 13
LICENCIA
Esta obra se publica bajo la licencia Creative Commons Reconocimiento - No Comercial - Compartir
Igual 3.0, cuyos detalles puedes consultar en http://creativecommons.org/licenses/by-nc-sa/3.0/es/.
Puedes copiar, distribuir y comunicar pblicamente la obra, incluso transformndola, siempre que
cumplas todas las condiciones siguientes:
Reconocimiento: debes reconocer siempre la autora de la obra original, indicando tanto el
nombre del autor (Arkaitz Garro) como el nombre del sitio donde se public originalmente
www.arkaitzgarro.com. Este reconocimiento no debe hacerse de una manera que sugiera que el
autor o el sitio apoyan el uso que haces de su obra.
No comercial: no puedes utilizar esta obra con fines comerciales de ningn tipo. Entre otros, no
puedes vender esta obra bajo ningn concepto y tampoco puedes publicar estos contenidos en
sitios web que incluyan publicidad de cualquier tipo.
Compartir igual: si alteras o transformas esta obra o si realizas una obra derivada, debes
compartir tu trabajo obligatoriamente bajo esta misma licencia.
Qu es HTML5? | HTML5
HTML5
Anterior Siguiente
CAPTULO 1 QU ES HTML5?
HTML5 (HyperText Markup Language, versin 5) es la quinta revisin del lenguaje HTML.
Esta nueva versin (an en desarrollo), y en conjunto con CSS3, define los nuevos
estndares de desarrollo web, rediseando el cdigo para resolver problemas y
actualizndolo as a nuevas necesidades. No se limita solo a crear nuevas etiquetas o
atributos, sino que incorpora muchas caractersticas nuevas y proporciona una
plataforma de desarrollo de complejas aplicaciones web (mediante los APIs).
HTML5 est destinado a sustituir no slo HTML 4, sino tambin XHTML 1 y DOM Nivel 2.
Esta versin nos permite una mayor interaccin entre nuestras pginas web y el
contenido media (video, audio, entre otros) as como una mayor facilidad a la hora de
codificar nuestro diseo bsico.
Algunas de las nuevas caractersticas de HTML5 seran:
Nuevas etiquetas semnticas para estructurar los documentos HTML, destinadas a
remplazar la necesidad de tener una etiqueta <div> que identifique cada bloque de
la pgina.
Los nuevos elementos multimedia como <audio> y <video> .
La integracin de grficos vectoriales escalables (SVG) en sustitucin de los
genricos <object> , y un nuevo elemento <canvas> que nos permite dibujar en l.
El cambio, redefinicin o estandarizacin de algunos elementos, como <a> , <cite>
o <menu> .
MathML para frmulas matemticas.
1.2 5 TIPS
1.2.1 HTML5 ES API
Se puede pensar en HTML slo como nuevas etiquetas y geolocalizacin. Pero esta no es
ms que una pequea parte del estndar que define HTML5. La especificacin de HTML5
define tambin cmo esas etiquetas interactan con JavaScript, a travs del Modelo de
Objetos de Documento (DOM). HTML5 no es nicamente definir una etiqueta como
<video> , tambin existe su correspondiente API para objetos de vdeo en el DOM. Se
puede utilizar esta API para detectar el soporte para diferentes formatos de vdeo,
reproducir el vdeo, hacer una pausa, silenciar el audio, realizar un seguimiento de la
cantidad de vdeo que se ha descargado, y todo lo que necesita para crear una completa
experiencia de usuario alrededor de la etiqueta en s.
1.2.4 YA FUNCIONA!
Si se quiere dibujar en un lienzo, reproducir vdeo, disear mejores formas, o construir
aplicaciones web que funcionan offline, nos encontramos con que HTML5 ya est bien
soportado. Firefox, Safari, Chrome, Opera y los navegadores mviles ya son compatibles
con canvas, video, la geolocalizacin, el almacenamiento local, y ms funcionalidades.
Incluso Microsoft (raramente conocido por el soporte de estndares) soporta la mayora
de las caractersticas de HTML5 en Internet Explorer 9.
NDICE DE CONTENIDOS
Qu es HTML5?
Especificacin oficial
5 Tips
Semntica | HTML5
HTML5
Anterior Siguiente
CAPTULO 2 SEMNTICA
Una de las novedades que hemos mencionado anteriormente son las etiquetas que se
han introducido en HTML5. Existen ms de 30 nuevas etiquetas semnticas que pueden
ser utilizadas en nuestras pginas estticas. Estas nuevas etiquetas se podran clasificar
en dos grupos:
Etiquetas que extienden a las actuales, como <video> , <audio> o <canvas> , y
que adems aaden nuevas funcionalidades a los documentos HTML, que
podemos controlar desde JavaScript y
etiquetas que componen la web semntica, es decir, que no proponen nuevas
funcionalidades pero sirven para estructurar sitios web, y aadir un significado
concreto, ms all de las etiquetas generales como <div> .
En este captulo, veremos como transformar nuestra estructura actual de marcado
basada en <div> , a una estructura que utiliza las nuevas etiquetas estructurales
como
<nav> , <header> , <footer> , <aside> , o <article> .
2.1.1 DOCTYPE
El estndar XHTML deriva de XML, por lo que comparte con l muchas de sus normas y
sintaxis. Uno de los conceptos fundamentales de XML es la utilizacin del DTD o
Document Type Definition ("Definicin del Tipo de Documento"). El estndar XHTML
define el DTD que deben seguir las pginas y documentos XHTML. En este documento se
definen las etiquetas que se pueden utilizar, los atributos de cada etiqueta y el tipo de
valores que puede tener cada atributo.
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE html>
En este caso ocurre lo mismo con el atributo xml:lang , es una herencia de XHTML
que podemos eliminar, quedando finalmente la etiqueta de la siguiente manera:
<html lang="en">
charset="utf-8"
content="text/html; charset=UTF-8">
2.1.3.2 LINKS
Dentro del elemento head , las etiquetas <link> son una manera de acceder o declarar
contenido externo al documento actual, que puede cumplir distintos objetivos:
Es una hoja de estilo contiene las reglas CSS que su navegador debe aplicar al
presente documento.
Es un feed que contiene el mismo contenido que esta pgina, pero en un formato
estndar (RSS).
Es una traduccin de esta pgina en otro idioma.
Es el mismo contenido que esta pgina, pero en formato PDF.
Es el prximo captulo de un libro en lnea de la cual esta pgina es tambin una
parte.
En HTML5, se separan estas relaciones de enlace en dos categoras:
Enlaces a recursos externos que se van a utilizar para mejorar el documento actual,
y enlaces de hipervnculos que son enlaces a otros documentos.
El tipo de relacin ms utilizado (literalmente) es el siguiente:
<link rel="stylesheet" href="style-original.css" type="text/css"
/>
Esta relacin es utilizada para indicar el archivo donde se almacenan las reglas CSS que
se desean aplicar al documento. Una pequea optimizacin que se puede hacer en
HTML5 es eliminar el atributo type . Slo hay un lenguaje de estilo para la web, CSS,
as que ese es el valor predeterminado para el atributo type :
<link rel="stylesheet" href="style-original.css"
/>
cualquier sistema podr procesar la pgina y saber cmo est estructurada. Veamos
algunas de estas etiquetas que introduce HTML5 en este sentido.
<section></section> : se utiliza para representar una seccin "general" dentro
a otras partes dentro de la pgina. No todos los grupos de enlaces en una pgina
necesita estar en un elemento nav , slo las secciones que constan de bloques de
navegacin principales son apropiados para el elemento de navegacin.
<footer></footer> : representa el pie de una seccin, con informacin acerca de la
pgina/seccin que poco tiene que ver con el contenido de la pgina, como el autor,
el copyright o el ao.
<hgroup></hgroup> : representa el encabezado de una seccin. El elemento se
utiliza para agrupar un conjunto de elementos h1-h6 cuando el ttulo tiene varios
niveles, tales como subttulos o ttulos alternativos.
<time> : representa o bien una hora (en formato de 24 horas), o una fecha
</div>
<div class="articles">
<div class="article">
<p class="post-date">October 22, 2009</p>
<h2>
<a href="#" title="link to this post">Travel day</a>
</h2>
<div class="content">
Content goes here...
</div>
<div class="comments">
<p><a href="#">3 comments</a></p>
</div>
</div>
</div>
<div class="aside">
<div class="related"></div>
<div class="related"></div>
<div class="related"></div>
</div>
<div id="footer">
<p>§</p>
<p>© 2013–9 <a href="#">Arkaitz Garro</a></p>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<header>
<a href="/"><img src=logo.png alt="home"></a>
<hgroup>
<h1>Title</h1>
<h2 class="tagline">
A lot of effort went into making this effortless.
</h2>
</hgroup>
</header>
<nav>
<ul>
<li><a href="#">home</a></li>
<li><a href="#">blog</a></li>
<li><a href="#">gallery</a></li>
<li><a href="#">about</a></li>
</ul>
</nav>
<section class="articles">
<article>
<time datetime="2009-10-22">October 22, 2009</time>
<h2>
<a href="#" title="link to this post">Travel day</a>
</h2>
<div class="content">
Content goes here...
</div>
<section class="comments">
<p><a href="#">3 comments</a></p>
</section>
</article>
</section>
<aside>
<div class="related"></div>
<div class="related"></div>
<div class="related"></div>
</aside>
<footer>
<p>§</p>
<p>© 2013–9 <a href="#">Arkaitz Garro</a></p>
</footer>
</body>
</html>
Partiendo de la anterior estructura, parece evidente las nuevas etiquetas que debemos
utilizar. Esto no siempre es as, y cuando estructuramos contenidos de mucho mayor
alcance, lo normal es que nos surjan dudas. Un sencillo algoritmo que nos puede ayudar
alt="home"></a>
Tambin es muy comn que los sitios web muestren un lema o subttulo bajo el ttulo
Semntica | HTML5
principal. Para dar mayor importancia a este subttulo, y relacionarlo de alguna manera
con el ttulo principal de la web, es posible agrupar los dos titulares bajo un elemento
<hgroup> .
<header>
<a href="/"><img src=logo.png alt="home"></a>
<hgroup>
<h1>Title</h1>
<h2 class="tagline">
A lot of effort went into making this effortless.
</h2>
</hgroup>
</header>
2.4.2<NAV>
Segn la especificacin, un elemento <nav> representa lo siguiente:
El elemento <nav> representa una seccin de una pgina que enlaza con otras
pginas o partes de la misma pgina: una seccin con enlaces de navegacin.
El elemento <nav> ha sido diseado para identificar la navegacin de un sitio web. La
navegacin se define como un conjunto de enlaces que hacen referencia a las secciones
de una pgina o un sitio, pero no todos los enlaces son candidatos de pertenecer a un
elemento <nav> : una lista de enlaces a patrocinadores o los resultados de una
bsqueda, no forman parte de la navegacin principal, sino que corresponden con el
contenido de la pgina.
Como ocurre con los elementos <header> , <footer> y el resto de nuevas etiquetas, no
estamos obligados a utilizar un nico elemento <nav> en toda la pgina. Es posible que
tengamos una navegacin principal en la cabecera de la pgina, una tabla de contenidos
o enlaces en el pie de la pgina, que apuntan a contenidos secundarios. Todos ellos son
candidatos a pertenecer a un elemento <nav> .
<nav>
<ul>
<li><a href="#">home</a></li>
<li><a href="#">blog</a></li>
<li><a href="#">gallery</a></li>
<li><a href="#">about</a></li>
</ul>
</nav>
2.4.3<FOOTER>
Segn la especificacin, un elemento <footer> representa lo siguiente:
2.4.4<ARTICLE>
Segn la especificacin, un elemento <article> representa lo siguiente:
Este elemento representa un contenido completo, auto-contenido en un documento,
pgina, aplicacin o sitio web, que es, en principio, independiente de ser distribuido
y reutilizado, por ejemplo en un RSS. Puede ser un post de un foro, un artculo de
un peridico o revista, una entrada de un blog, un comentario de un usuario, un
widget o cualquier otro elemento independiente.
Cuando los artculos estn anidados, los artculos interiores representan contenido
que en principio est relacionado con el artculo que los contiene. Por ejemplo, una
entrada de un blog puede aceptar comentarios de usuarios, que estn incluidos
dentro del contenido principal y relacionados con el mismo.
Por lo tanto, la etiqueta <article> se utiliza para encapsular contenido, que tiene
significado en s mismo, y que puede ser distribuido y reutilizado en otros formatos de
datos. No nos referimos nicamente a contenidos clsicos de texto, sino que incluso un
contenido multimedia con su transcripcin, un mapa o email pueden ser totalmente
vlidos para ser incluidos en una etiqueta <article> .
<section>
<h1>Comments</h1>
<article id="c1">
<footer>
<p>Posted by: <span>George Washington</span></p>
<p><time datetime="2009-10-10">15 minutes ago</time></p>
</footer>
<p>Yeah! Especially when talking about your lobbyist friends!</p>
</article>
<article id="c2">
<footer>
<p>Posted by: <span itemprop="name">George Hammond</span></p>
<p><time datetime="2009-10-10">5 minutes ago</time></p>
</footer>
<p>Hey, you have the same first name as me.</p>
</article>
</section>
2.4.5<SECTION>
A diferencia del elemento <article> , este elemento es utilizado para dividir el
documento (o artculos) en diferentes reas, o como su propio nombre indica, en
secciones. Segn la especificacin, un elemento <section> representa lo siguiente:
Representa una seccin genrica de un documento o aplicacin. Una seccin, en
este contexto, es un grupo temtico de contenido, que generalmente incluye una
cabecera.
Consideremos el siguiente marcado vlido en HTML 4:
<h1>Rules for Munchkins</h1>
<h2>Yellow Brick Road</h2>
<p>It is vital that Dorothy follows itso no selling
bricks as "souvenirs"</p>
<h2>Fan Club uniforms</h2>
<p>All Munchkins are obliged to wear their "Im a friend
of Dorothy!" t-shirt when representing the club</p>
<p><strong>Vital caveat about the information above:
does not apply on the first Thursday of the month.</strong></p>
En este caso, y desde un punto de vista semntico, es complicado deducir si el texto Vital
caveat about the information above: does not apply on the first Thursday of the month.
pertenece al contenido completo o est relacionado con la seccin Fan Club uniforms.
Gracias a la etiqueta <section> , es muy sencillo separar e identificar a qu
seccin pertenece cada contenido:
<article>
<h1>Rules for Munchkins</h1>
<section>
<h2>Yellow Brick Road</h2>
<p>It is vital that Dorothy follows itso no selling
bricks as "souvenirs"</p>
</section>
<section>
<h2>Fan Club uniforms</h2>
<p>All Munchkins are obliged to wear their "Im a friend
of Dorothy!" t-shirt when representing the club</p>
</section>
<p><strong>Vital caveat about the information above:
does not apply on the first Thursday of the month.</strong></p>
</article>
<article>
<h1>Rules for Munchkins</h1>
<section>
<h2>Yellow Brick Road</h2>
<p>It is vital that Dorothy follows itso no selling
bricks as "souvenirs"</p>
</section>
<section>
<h2>Fan Club uniforms</h2>
<p>All Munchkins are obliged to wear their "Im a friend
of Dorothy!" t-shirt when representing the club</p>
<p><strong>Vital caveat about the information above:
does not apply on the first Thursday of the month.</strong></p>
</section>
</article>
Como podemos observar en los dos ejemplos anteriores, es muy sencillo agrupar
contenido que pertenece a una misma seccin, permitiendo incluirlo dentro de un
contexto semntico.
Otra de las posibilidades que nos ofrece esta etiqueta, es la de dividir nuestro documento
en secciones, que incluyen contenido de temticas diferentes entre s. Si adems
queremos separar estos contenidos visualmente en dos columnas, lo lgico sera utilizar
las tradicionales etiquetas <div> para agrupar los artculos segn su temtica, y
posteriormente aplicar estilos CSS o JavaScript para presentarlos en forma de pestaas.
En este caso, la etiqueta <div> no nos aporta ningn significado semntico, tan slo
estructural. La etiqueta <section> es la encargada de aadir semntica en estos casos:
<section>
<h1>Articles about llamas</h1>
<article>
<h2>The daily llama: Buddhism and South American
<p>blah blah</p>
</article>
<article>
<h2>Shh! Do not alarm a llama</h2>
<p>blah blah</p>
</article>
</section>
<section>
<h1>Articles about root vegetables</h1>
<article>
<h2>Carrots: the orange miracle</h2>
<p>blah blah</p>
</article>
camelids</h2>
<article>
<h2>Eat more Swedes (the vegetables, not the
<p>blah blah</p>
</article>
</section>
people)</h2>
2.4.6<ASIDE>
Segn la especificacin, un elemento <aside> representa lo siguiente:
Una seccin de una pgina que consiste en contenido tangencialmente relacionado
con el contenido alrededor del elemento, y puede considerarse separado de este
contenido. Estas secciones son normalmente representadas como elementos
laterales en medios impresos. Este elemento puede utilizarse contener citas,
anuncios, grupos de elementos de navegacin y cualquier otro contenido separado
del contenido principal de la pagina.
Dentro de un artculo, por ejemplo, puede ser utilizado para mostrar contenido
relacionado como citas u otros artculos relacionados.
2.4.7<FIGURE>
Segn la especificacin, un elemento <figure> representa lo siguiente:
The figure element represents some flow content, optionally with a caption, that is
self-contained and is typically referenced as a single unit from the main flow of
the document.
The element can be used to annotate illustrations, diagrams, photos, code listings,
etc. This includes, but is not restricted to, content referred to from the main part
of the document, but that could, without affecting the flow of the document, be
moved away from that primary content, e.g. to the side of the page, to dedicated
pages, or to an appendix.
Hasta ahora, no haba una manera correcta de poder aadir un subttulo o una leyenda a
un contenido concreto, como explicar una figura o atribuir una imagen a un fotgrafo.
Gracias a la etiqueta <figure> podemos contener una imagen (o un vdeo, ilustracin o
bloque de cdigo) en un elemento y relacionarlo con un contenido concreto:
<figure>
<img src="welcome.jpg" alt="Alternative text">
<figcaption>
Bruce and Remy welcome questions
<small>Photo © Bruces mum</small>
</figcaption>
</figure>
En conveniente recordar que el atributo alt indica el texto a mostrar cuando la imagen
no est disponible, y no est pensada para contener una descripcin de la imagen, y
mucho menos para duplicar lo ya indicado en la etiqueta <figcaption> .
Ejercicio 1
Ver enunciado
2.5.1 ACCESSKEY
El atributo accesskey permite a los desarrolladores especificar un atajo de teclado que
permite activar un elemento a asignarle el foco. Este atributo ya exista en HTML 4,
aunque ha sido utilizado en muy pocas ocasiones. Como HTML5 est pensado para
aplicaciones, y algunos usuarios siguen prefiriendo los atajos de teclado, este atributo no
ha sido eliminado, y ahora est disponible para cualquier elemento.
Para evitar conflictos con otros atajos de teclado, o con los propios del navegador, ahora
esta etiqueta permite asignar alternativas en este atributo. Un ejemplo incluido en la
especificacin:
<input type="search" name="q" accesskey="s
0">
Esto quiere decir que este elemento es accesible a travs de dos atajos de teclado, a
travs de la tecla s o a travs de la tecla 0 (en ese orden).
2.5.2 CONTENTEDITABLE
Inventado por Microsoft, e implementado por el resto de los navegadores, la etiqueta
contenteditable es ahora parte de la especificacin oficial.
Finalmente, el contenido que ha sido seleccionado por el usuario, puede ser objeto de
modificaciones, como hemos comentado antes. A travs del comando
element.execCommand() es posible indicar el tipo de modificacin (poner en negrita,
copiar, cambiar la fuente...), siempre que el documento se haya indicado como editable.
document.designMode = 'on';
2.5.4 DRAGGABLE
Este atributo indica que el elemento indicado puede ser arrastable. Lo veremos en el
captulo correspondiente.
NDICE DE CONTENIDOS
Semntica
Cabecera del documento
Nuevas etiquetas semnticas
Estructura de un documento HTML5
Uso de las nuevas etiquetas semnticas
Atributos globales
HTML5
Anterior Siguiente
3.1.1TIPO EMAIL
El nuevo tipo <input type="email"> indica al navegador que no debe permitir que se
enve el formulario si el usuario no ha introducido una direccin de email vlida, pero no
comprueba si la direccin existe o no, slo si el formato es vlido. Como ocurre con el
resto de campos de entrada, puede enviar este campo vaco a menos que se indique que
es obligatorio.
El atributo multiple indica que el valor de este campo, puede ser una lista de emails
vlidos, separados por comas.
http://www.arkaitzgarro.com/html5/capitulo-3.html[13/07/2015 11:59:21]
3.1.2TIPO URL
El nuevo tipo <input type="url"> indica al navegador que no debe permitir que se enve
el formulario si el usuario no ha introducido una URL correcta. Algunos navegadores
ofrecen ayudas al usuario, como Opera que aade el prefijo http:// a la URL si el
usuario no lo ha introducido. Una URL no tiene que ser necesariamente una direccin
web, sino que es posible utilizar cualquier formato de URI vlido, como por ejemplo
tel:555123456 .
3.1.3TIPO DATE
El nuevo tipo <input type="date"> es de los ms esperados y tiles. En muchos de los
sitios web es normal disponer de campos especficos de fecha, donde el usuario debe
especificar fechas (para un concierto, vuelo, reserva de hotel, etc). Al existir tantos
formatos de fecha diferentes (DD-MM-YYYY o MM-DD-YYYY o YYYY-MM-DD), esto puede
suponer un inconveniente para los desarrolladores o los propios usuarios.
Este nuevo tipo de campo resuelve estos problemas, ya que es el navegador el que
proporciona la interfaz de usuario para el calendario, e independientemente del formato
en el que se muestre, los datos que se envan al servidor cumplen la norma ISO para el
formato de fechas.
3.1.4TIPO TIME
El nuevo tipo <input type="time"> permite introducir una hora en formato 24h, y
validarlo. De nuevo, es el navegador el encargado de mostrar la interfaz de usuario
correspondiente: puede ser un simple campo donde es posible introducir la hora y los
minutos, o mostrar algo ms complejo como un reloj de agujas.
3.1.5TIPO DATETIME
Este nuevo tipo de campo es la combinacin de los tipos date y time , por lo que
se valida tanto la fecha como la hora introducida.
3.1.6TIPO MONTH
El nuevo tipo <input type="month"> permite la seleccin de un mes en concreto. La
representacin interna del mes es un valor entre 1 y 12, pero de nuevo queda en manos
del navegador la manera de mostrarlo al usuario, utilizando los nombres de los meses
por ejemplo.
3.1.7TIPO WEEK
El nuevo tipo <input type="week"> permite la seleccin de una semana del ao concreta.
La representacin interna del mes es un valor entre 1 y 53, pero de nuevo queda en
manos del navegador la manera de mostrarlo al usuario. La representacin interna de la
semana 7, por ejemplo, es la siguiente: 2013-W07 .
3.1.8TIPO NUMBER
Como es de esperar, el nuevo tipo <input type="number"> valida la entrada de un tipo
de dato numrico. Este tipo de campo encaja perfectamente con los atributos min , max
y step , que veremos ms adelante.
3.1.9TIPO RANGE
El nuevo tipo <input type="range"> , muestra un control deslizante en el navegador.
Para conseguir un elemento de este estilo, era necesario un gran esfuerzo para
combinar imgenes, funcionalidad y accesibilidad, siendo ahora mucho ms sencillo.
Este tipo de campo encaja de nuevo perfectamente con los atributos min , max y step
, que veremos ms adelante.
3.1.10
TIPO TEL
3.1.11
TIPO SEARCH
3.1.12
TIPO COLOR
atributo, list , que hace referencia a otro elemento, permitiendo crear un nuevo tipo
de entrada de datos.
En este ejemplo se utiliza un campo de tipo text , pero puede ser utilizado
igualmente con campos de tipo url y email .
3.2.2ATRIBUTO AUTOFOCUS
El atributo booleano autofocus permite definir que control va a tener el foco cuando la
pgina se haya cargado. Hasta ahora, esto se consegua a travs de JavaScript,
utilizando el mtodo .focus() en un elemento concreto, al cargarse el documento.
Ahora es el navegador el encargado de esta tarea, y puede comportarse de manera ms
inteligente, como no cambiando el foco de un elemento si el usuario ya se encuentra
escribiendo en otro campo (ste era un problema comn con JavaScript).
nicamente debe existir un elemento con este atributo definido en el documento. Desde
el punto de vista de la usabilidad, hay que utilizar este atributo con cuidado. Hay que
utilizarlo nicamente cuando el control que recibe el foco es el elemento principal de la
pgina, como en un buscador, por ejemplo.
3.2.3ATRIBUTO PLACEHOLDER
Una pequea mejora en la usabilidad de los formularios, suele ser colocar un pequeo
texto de ayuda en algunos campos, de manera discreta y que desaparece cuando el
usuario introduce algn dato. Como con el resto de elementos, hasta ahora era
necesario utilizar JavaScript para realizar esta tarea, pero el atributo placeholder
resuelve esta tarea.
Es importante recordar que este atributo no sustituye a la etiqueta <label> .
3.2.4ATRIBUTO REQUIRED
Este atributo puede ser utilizado en un <textarea> y en la gran mayora de los elementos
<input> (excepto en los de tipo hidden , image o botones como submit ). Cuando este
3.2.5ATRIBUTO MULTIPLE
Este atributo permite definir que un campo puede admitir varios valores, como URLs o
emails. Un uso muy interesante de este atributo es utilizarlo en conjunto con el campo
<input type="file"> , ya que de esta manera nos permite seleccionar varios
ficheros que podemos enviar al servidor al mismo tiempo.
<input type="file"
multiple="multiple">
3.2.6ATRIBUTO AUTOCOMPLETE
Algunos navegadores suelen incluir alguna funcionalidad de autocompletado en algunos
campos de formulario. A pesar de haber sido introducido recientemente en el estndar
de HTML5, es una caracterstica que lleva mucho tiempo siendo utilizada, concretamente
desde la versin 5 de Internet Explorer.
Este atributo permite controlar el comportamiento del autocompletado en los campos de
texto del formulario (que por defecto est activado).
max="2010-12-31">
3.2.8ATRIBUTO STEP
El atributo step controla los pasos por los que un campo aumenta o disminuye su valor.
Si un usuario quiere introducir un porcentaje, pero queremos que sea en mltiplos de 5,
lo haramos de la siguiente manera:
<input type="range" mix="0" max="100"
step="5">
3.2.9ATRIBUTO PATTERN
Algunos de los tipos de input que hemos visto anteriormente ( email , number , url
...), son realmente expresiones regulares que el navegador evala cuando se
introducen datos. El atributo pattern nos permite definir una expresin regular que el
valor del campo debe cumplir. Por ejemplo, si el usuario debe introducir un nmero
seguido de tres letras maysculas, podramos definir esta expresin regular:
<input pattern="[0-9][A-Z]{3}" name="part"
title="A part number is a digit followed by three uppercase
letters.">
3.2.10
ATRIBUTO FORM
En este caso, el elemento <textarea> se encuentra fuera del formulario, pero realmente
pertenece a l ya que hemos definido el atributo form con el identificador del formulario.
3.3.1 <PROGRESS>
El elemento <progress> es utilizado para representar un avance o progreso en la
ejecucin de una tarea, como puede ser la descarga de un fichero o la ejecucin de una
tarea compleja. Define los siguientes atributos:
max : define el trabajo total a realizar por la tarea, la duracin de un vdeo...
ser mayor o igual a 0.0 y menor o igual a 1.0 o el valor especificado en max .
position : atributo de slo lectura que representa la posicin actual del elemento
<progress> . Este valor es igual a value / max y -1 si no se puede determinar
la posicin.
Las unidades son arbitrarias, y no se especifican.
<progress value="5"
max="20">5</progress>
3.3.2 <METER>
El elemento <meter> es muy similar a <progress> (de hecho, se discute la necesidad de
disponer de dos elementos tan similares). Esta nueva etiqueta se usa para representar
escalas de medidas conocidas, como la longitud, masa, peso, uso de disco, entre otras.
Define los siguientes atributos:
value : representa el valor actual. Si no se especifica, se toma como valor el
primer nmero que aparece en el contenido del elemento. Su valor por defecto es
0 .
min : el mnimo valor permitido. El valor por defecto es 0 .
menos que el valor mnimo definido sea mayor que 1 , en cuyo caso el valor de max
ser igual a min .
low : es considerado el lmite inferior del rango de valores.
max : es considerado el lmite superior del rango de valores.
optimum : representa el valor ptimo del elemento, y se encuentra entre min y max
.
<p>Your score is:
<meter value="91" min="0" max="100"
low="40" high="90" optimum="100">A+</meter>
</p>
NDICE DE CONTENIDOS
Elementos de formulario
Nuevos tipos de input
Nuevos atributos
Nuevos elementos
Qu es Modernizr | HTML5
HTML5
Anterior Siguiente
CAPTULO 4 QU ES MODERNIZR
Modernizr es una librera JavaScript que nos permite conocer la compatibilidad del
navegador con tecnologas HTML5 y CSS3, lo que nos permitir desarrollar sitios web
que se adapten a las capacidades cada navegador.
Este framework es un paquete de deteccin de las capacidades de un navegador relativas
a HTML5 y CSS3, esto es, una librera JavaScript que nos informar cules de las
funcionalidades de estas tecnologas estn disponibles en el navegador del usuario, para
utilizarlas, o no, en cada caso.
Sabiendo que nuestro navegador soporta ciertas capacidades de CSS3 o de HTML5,
podremos utilizarlas con libertad. De modo contrario, si sabemos que un navegador no
es compatible con determinada funcionalidad, podremos implementar variantes que s
soporte y as crear sitios web que se adaptan perfectamente al cliente web de cada
visitante.
Existen dos herramientas principales en Modernizr que se pueden utilizar para detectar
las funcionalidades que estn presentes en un navegador. Una la podemos utilizar a
travs de JavaScript y otra directamente sobre cdigo CSS. En resumen, con Modernizr
podemos detectar las funcionalidades disponibles de CSS3 y HTML5.
src="/js/lib/vendor/modernizr-custom.min.js"></script>
http://www.arkaitzgarro.com/html5/capitulo-4.html[13/07/2015 11:59:48]
disponible
Aqu estamos consultando la propiedad boxshadow del objeto Modernizr. Esta propiedad
nos indica si el navegador es compatible con el atributo box-shadow de CSS3, que sirve
para crear cajas de contenido con sombreado.
Ahora veamos otro ejemplo similar que detectara si est disponible el elemento canvas
del HTML5.
if (Modernizr.canvas) {
// Podemos utilizar canvas!
} else {
// El elemento canvas no est
}
disponible
Qu es Modernizr | HTML5
utilizar dicha clase CSS para aplicar estilos que sabemos que solo acabarn afectando a
los navegadores que soporten el atributo box-shadow .
.boxshadow .elemento{
border: 1px solid #ccc;
box-shadow: #999 3px 3px 3px;
}
Como se puede ver, hemos sobrescrito la regla CSS para el borde y adems hemos
aplicado la propiedad box-shadow . El efecto conseguido es que los navegadores
modernos, que son capaces de procesar el atributo box-shadow , mostrarn una sombra
CSS3 y los no compatibles con esta propiedad al menos mostrarn unos estilos para los
que s son compatibles.
Ejercicio 3
Ver enunciado
Qu es Modernizr | HTML5
Ejercicio 4
Ver enunciado
NDICE DE CONTENIDOS
Qu es Modernizr
Aadir Modernizr a una pgina
Objeto Modernizr
Clases CSS en Modernizr
El mtodo load()
Dataset | HTML5
HTML5
Anterior Siguiente
CAPTULO 5 DATASET
Gracias a HTML5, ahora tenemos la posibilidad de incorporar atributos de datos
personalizados en todos los elementos HTML. Hasta la aparicin de estos atributos, la
manera de lograr un comportamiento similar (asociar datos a elementos), era incluir
estos datos como clases CSS en los elementos, y acceder a ellos a travs de jQuery, de
una manera como la siguiente:
<input class="spaceship shields-5 lives-3
energy-75">
Una vez definidos los "atributos", era necesario acceder a estas clases y realizar un
trabajo extra para extraer su nombre y su valor (convertir energy-75 en energy = 75 ).
Afortunadamente, esto ya no es necesario, gracias a los atributos dataset . Estos
nuevos atributos de datos personalizados constan de dos partes:
Nombre del atributo: el nombre del atributo de datos debe ser de al menos un
carcter de largo y debe tener el prefijo data- . No debe contener letras
maysculas.
Valor del atributo: el valor del atributo puede ser cualquier string o cadena. Con
esta sintaxis, podemos aadir cualquier dato que necesitemos a nuestra aplicacin,
como se muestra a continuacin:
<ul id="vegetable-seeds">
<li data-spacing="10cm" data-sowing-time="March to
June">Carrots</li>
<li data-spacing="30cm" data-sowing-time="February to
March">Celery</li>
<li data-spacing="3cm" data-sowing-time="March to
September">Radishes</li>
</ul>
Ahora podemos usar estos datos almacenados en nuestro sitio para crear una experiencia
de usuario ms rica y atractiva. Imagina que cuando un usuario hace clic en un
"vegetable", una nueva capa se abre en el explorador que muestra la separacin de
semillas e instrucciones de siembra. Gracias a los atributos data- que hemos aadido a
nuestros elementos <li> , ahora podemos mostrar esta informacin al instante sin tener
que preocuparnos de hacer ninguna llamada AJAX y sin tener que hacer ninguna
consulta a las bases de datos del servidor.
Prefijar los atributos personalizados con data- asegura que van a ser completamente
ignorados por el agente de usuario. Por lo que al navegador y al usuario final de la web
se refiere, no existe esta informacin.
http://www.arkaitzgarro.com/html5/capitulo-5.html[13/07/2015 11:59:59]
Custom data attributes are intended to store custom data private to the page or
application, for which there are no more appropriate attributes or elements. These
attributes are not intended for use by software that is independent of the site that
uses the attributes. Every HTML element may have any number of custom data
attributes specified, with any value.
W3C Specification
Esto es, los atributos de datos personalizados estn destinadas a almacenar los datos
personalizados que son de inters exclusivamente para la pgina o la aplicacin, para los
que no hay atributos o elementos ms apropiados. Estos atributos no estn destinados
para un uso externo (a travs de un software independiente al sitio que los utiliza). Cada
elemento HTML puede tener un nmero indefinido de atributos de datos personalizados,
con cualquier valor.
id="strawberry-plant" data-fruit="12"></div>
<script>
// "Getting" data-attributes using getAttribute
var plant = document.getElementById("strawberry-plant");
var fruitCount = plant.getAttribute("data-fruit"); // fruitCount =
"12"
id="sunflower"
data-leaves="47" data-plant-height="2.4m"></div>
<script>
// "Getting" data-attributes using dataset
var plant = document.getElementById("sunflower");
var leaves = plant.dataset.leaves; // leaves = 47;
// "Setting" data-attributes using dataset
var tallness = plant.dataset.plantHeight; // "plant-height" -> "plantHeight"
plant.dataset.plantHeight = "3.6m"; // Cracking fertiliser
</script>
En conclusin, los data attributes personalizados son una buena manera de simplificar el
NDICE DE CONTENIDOS
Dataset
Utilizacin de los data attributes
data attributes y JavaScript
Multimedia | HTML5
HTML5
Anterior Siguiente
CAPTULO 6 MULTIMEDIA
Hasta hace no mucho tiempo, la tecnologa Flash era el dominador indiscutible en el
campo multimedia de la web. Gracias a esta tecnologa es relativamente sencillo
transmitir audio y vdeo a travs de la red, y realizar animaciones que de otra manera
sera imposible. Prcticamente todos los navegadores tienen incorporado un plugin para
la reproduccin de archivos flash, por lo que la eleccin era clara. Entonces, por qu
una necesidad de cambio?
Hasta ahora, para incluir un elemento multimedia en un documento, se haca uso del
elemento <object> , cuya funcin es incluir un elemento externo genrico. Debido a
la incompatibilidad entre navegadores, se haca tambin necesario el uso del
elemento
<embed> y duplicar una serie de parmetros. El resultado era un cdigo de este estilo:
<object width="425" height="344">
<param name="movie"
value="http://www.youtube.com/v/9sEI1AUFJKw&hl=en_GB&fs=1&"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="http://www.youtube.com/v/9sEI1AUFJKw&hl=en_GB&fs=1&"
type="application/x-shockwave-flash"
allowscriptaccess="always"
allowfullscreen="true" width="425" height="344"></embed>
</object>
Dejando de lado que el cdigo es poco amigable, en este caso tenemos el problema que
el navegador tiene que transmitir el vdeo a un plugin instalado en el navegador, con la
esperanza que el usuario tenga instalada la versin correcta o tenga permisos para
hacerlo, y muchos otros requisitos que pueden ser necesarios. Los plugins pueden
causar que el navegador o el sistema se comporte de manera inestable, o incluso
podemos crear una inseguridad a usuarios sin conocimientos tcnicos, a los que se pide
que descarguen e instalen un nuevo software.
De alguna manera, podemos estar creando una barrera para ciertos usuarios, algo que
no es para nada deseable.
VDEO
Una de las mayores ventajas del elemento <video> (y <audio> ) de HTML5, es que,
finalmente, estn totalmente integrados en la web. Ya no es necesario depender de
software de terceros, y esto es una gran ventaja.
http://www.arkaitzgarro.com/html5/capitulo-6.html[13/07/2015 12:00:10]
MARCADO
Para hacer funcionar el vdeo en HTML, es suficiente con incluir el siguiente marcado, de
manera similar que lo hacemos con las imgenes:
<video src="movie.webm"> </video>
-->
Sin embargo, este ejemplo realmente no hace nada por el momento. Lo nico que se
muestra es el primer fotograma de la pelcula. Esto es as porque no le hemos dicho al
navegador que inicie el vdeo, ni le hemos mostrado al usuario ningn tipo de control
para reproducir o pausar el vdeo.
6.1.2AUTOPLAY
Si bien podemos indicar al navegador que reproduzca el vdeo de manera automtica una
vez se haya cargado la pgina, en realidad no es una buena prctica, ya que a muchos
usuarios les parecer una prctica muy intrusiva. Por ejemplo, los usuarios de
dispositivos mviles, probablemente no querrn que el vdeo se reproduzca sin su
autorizacin, ya que se consume ancho de banda sin haberlo permitido explcitamente.
No obstante, la manera de hacerlo es la siguiente:
<video src="movie.webm" autoplay>
<!-- Your fallback content here
</video>
-->
6.1.3CONTROLS
Proporcionar controles es aproximadamente un 764% mejor que reproducir el vdeo de
manera automtica. La manera de indicar que se muestren los controles es la siguiente:
<video src="movie.webm" controls>
<!-- Your fallback content here
</video>
-->
Naturalmente, y al igual que ocurre con los campos de formulario, los navegadores
6.1.4POSTER
El atributo poster indica la imagen que el navegador debe mostrar mientras el vdeo se
est descargando, o hasta que el usuario reproduce el vdeo. Esto elimina la necesidad
de mostrar una imagen externa que despus hay que eliminar con JavaScript. Si no se
indica este atributo, el navegador muestra el primer fotograma del vdeo, que puede no
ser representativo del vdeo que se va a reproducir.
6.1.5MUTED
El atributo muted , permite que el elemento multimedia se reproduzca inicialmente sin
sonido, lo que requiere una accin por parte del usuario para recuperar el volumen. En
este ejemplo, el vdeo se reproduce automticamente, pero sin sonido:
<video src="movie.webm" controls autoplay loop
<!-- Your fallback content here -->
</video>
muted>
6.1.6HEIGHT, WIDTH
Los atributos height y width indican al navegador el tamao del vdeo en pixels. Si no
se indican estas medidas, el navegador utiliza las medidas definidas en el vdeo de
origen, si estn disponibles. De lo contrario, utiliza las medidas definidas en el
fotograma poster, si estn disponibles. Si ninguna de estas medidas est disponible, el
ancho por defecto es de 300 pixels .
Si nicamente se especifica una de las dos medidas, el navegador automticamente
ajusta la medida de la dimensin no proporcionada, conservando la proporcin del vdeo.
Si por el contrario, se especifican las dos medidas, pero no coinciden con la proporcin
del vdeo original, el vdeo no se deforma a estas nuevas dimensiones, sino que se
muestra en formato letterbox manteniendo la proporcin original.
6.1.7LOOP
El atributo loop indica que el vdeo se reproduce de nuevo una vez que ha finalizado su
reproduccin.
6.1.8PRELOAD
Es posible indicar al navegador que comience la descarga del vdeo antes de que el
usuario inicie su reproduccin.
<video src="movie.webm" controls preload>
<!-- Your fallback content here -->
</video>
lo indique el usuario.
preload=metadata : este estado sugiere al navegador que cargue los metadatos
6.1.9SRC
Al igual que en elemento <img> , el atributo src indica la localizacin del recurso, que el
navegador debe reproducir si el navegador soporta el codec o formato especfico. Utilizar
un nico atributo src es nicamente til y viable en entornos totalmente controlados,
donde conocemos el navegador que accede al sitio web y los codecs que soporta.
Sin embargo, como no todos los navegadores pueden reproducir los mismos formatos, en
entornos de produccin debemos especificar ms de una fuente de vdeo.
MP4
OGV
Opera
No
Firefox
Chrome
No
IE9+
No
No
Safari
No
No
WebM funciona en IE9+ y Safari si el usuario ha instalado los codec de manera manual.
Por lo tanto, la mejor solucin en estos momentos es ofrecer tanto el formato libre
WebM, como el propietario H.264.
800px)">
Mtodos
Eventos
error state
load()
loadstart
error
canPlayType(type)
progress
network state
play()
suspend
src
pause()
abort
currentSrc
error
networkState
emptied
preload
stalled
buffered
play
ready state
pause
readyState
loadedmetadata
seeking
loadeddata
controls
waiting
controls
playing
volume
canplay
muted
canplaythrough
tracks
seeking
tracks
seeked
playback state
timeupdate
currentTime
ended
startTime
ratechange
muted
paused
defaultPlaybackRate
playbackRate
played
seekable
ended
autoplay
loop
width [video only]
height [video only]
videoWidth [video only]
videoHeight [video only]
poster [video only]
Gracias a JavaScript y a este nuevo API, tenemos el control completo sobre los
elementos multimedia. Esto significa que podemos crearnos nuestros propios controles,
extendiendo los que nos ofrece el navegador. Un simple ejemplo de acceso al API del
elemento video :
video.addEventListener('canplay', function(e) {
this.volume = 0.4;
this.currentTime = 10;
this.play();
}, false);
completa.
document.getElementById("myvideo").requestFullScreen().
document.cancelFullScreen() : sale del modo pantalla completa y vuelve a la vista
del documento.
document.fullScreen : devuelve true si el navegador est en pantalla completa.
:full-screen : se trata de una pseudo-clase CSS que se aplica a un
6.5 AUDIO
El elemento multimedia audio es muy similar en cuanto a funcionalidad al elemento
video . La principal diferencia existe al indicar el atributo controls o no. Si lo
6.5.1 MARCADO
Para hacer funcionar el audio en HTML, al igual que con el video es suficiente con incluir
lo siguiente:
<audio src="audio.mp3">
</audio>
MP4
WAV
OGG
Opera
No
No
Firefox
No
No
Chrome
IE9+
No
No
Safari
No
Por lo tanto, la mejor solucin en estos momentos es ofrecer tanto el formato libre OGG,
como el propietario MP3, marcado de la siguiente manera:
<audio controls>
<source src="audio.ogg"
<source src="audio.mp3"
</audio>
Ejercicio 6
Ver enunciado
NDICE DE CONTENIDOS
Multimedia
Vdeo
type="audio/ogg">
type="audio/mpeg">
Canvas | HTML5
HTML5
Anterior Siguiente
CAPTULO 7 CANVAS
El elemento canvas proporciona un API para dibujar lneas, formas, imgenes, texto, etc
en 2D, sobre el lienzo que del elemento. Este API ya est siento utilizado de manera
exhaustiva, en la creacin de fondos interactivos, elementos de navegacin,
herramientas de dibujado, juegos o emuladores. ste elemento canvas es uno de los
elementos que cuenta con una de las mayores especificaciones dentro de HTML5. De
hecho, el API de dibujado en 2D se ha separado en un documento a parte.
Un ejemplo de lo que se puede llegar a crear, es la recreacin del programa MS Paint
incluido en Windows 95.
height="150"></canvas>
ste nos recuerda mucho al elemento img , pero sin los atributos src y alt . En
realidad, el elemento canvas solamente tiene los dos atributos mostrados en el ejemplo
anterior: width y height , ambos opcionales y que pueden establecerse mediante las
propiedades DOM. Cuando estos dos atributos no se especifican, el lienzo (canvas)
inicial ser de 300px de ancho por 150px de alto. Este elemento, adems y como
muchos otros, pueden modificarse utilizando CSS. Podemos aplicar cualquier estilo, pero
las reglas afectarn al elemento, no a lo dibujado en el lienzo.
En la actualidad, todos los navegadores son compatibles con el elemento canvas ,
la diferencia entre ellos radica en qu funcionalidades del API han implementado.
Ahora que el elemento canvas est definido en el documento, la manera de dibujar en l
es a travs de JavaScript. El primer paso es obtener el contexto de dibujado. <canvas>
crea una superficie de dibujo de tamao fijo que expone uno o ms contextos de
representacin, que se utilizan para crear y manipular el contenido mostrado. En el
contexto de representacin 2D, (existe otro contexto de representacin en 3D, llamado
WebGL), el canvas est inicialmente en blanco y, para mostrar algo, es necesario el
acceso de un script al contexto de representacin para que pueda dibujar en l. El
mtodo DOM getContext sirve para obtener el contexto de representacin y sus
funciones de dibujo.
var canvas = document.getElementById('tutorial');
var ctx = canvas.getContext('2d');
El siguiente ejemplo dibujara dos rectngulos que se cruzan, uno de los cuales tiene
transparencia alfa.
<html>
<head>
<script type="application/javascript">
window.onload = function() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(200,0,0)";
ctx.fillRect (10, 10, 55, 50);
ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
ctx.fillRect (30, 30, 55, 50);
}
};
</script>
</head>
<body>
<canvas id="canvas" width="150"
</body>
</html>
height="150"></canvas>
totalmente transparente.
Cada una de estas funciones tiene los mismos parmetros. x e y especifican la posicin
en el lienzo. width es la anchura y height la altura.
var canvas = document.getElementById('tutorial');
var ctx = canvas.getContext('2d');
ctx.fillRect(25,25,100,100);
ctx.clearRect(45,45,60,60);
ctx.strokeRect(50,50,50,50);
7.3 RUTAS
Gracias al API 2D, es posible movernos a travs del canvas y dibujar lneas y formas. Las
rutas son utilizadas para dibujar formas (lneas, curvas, polgonos, etc) que de otra
forma no podramos conseguir.
El primer paso para crear una ruta es llamar al mtodo beginPath . Internamente, las
rutas se almacenan como una lista de subrutas (lneas, arcos, etc.) que, en conjunto,
forman una figura. Cada vez que se llama a este mtodo, la lista se pone a cero y
podemos empezar a dibujar nuevas formas. El paso final sera llamar al mtodo
closePath : este mtodo intenta cerrar la forma trazando una lnea recta desde el punto
actual hasta el inicial. Si la forma ya se ha cerrado o hay solo un punto en la lista, esta
funcin no hace nada.
var canvas = document.getElementById('tutorial');
var context = canvas.getContext('2d');
context.beginPath();
//... path drawing operations
context.closePath();
El siguiente paso es dibujar la forma como tal. Para ello, disponemos de algunas
7.3.1MTODO LINETO
Para dibujar lneas rectas utilizamos el mtodo lineTo . Este mtodo toma dos
argumentos x e y , que son las coordenadas del punto final de la lnea. El punto
de partida depende de las rutas anteriores.
En el siguiente ejemplo se dibujan dos tringulos, uno relleno y el otro nicamente
trazado. En primer lugar se llama al mtodo beginPath para iniciar una nueva ruta. A
continuacin, utilizamos el mtodo moveTo para mover el punto de partida hasta la
posicin deseada. Finalmente se dibujan dos lneas que forman dos lados del tringulo.
Al llamar al mtodo closePath , ste traza una lnea al origen, completando el
tringulo.
// Tringulo relleno
ctx.beginPath();
ctx.moveTo(25,25);
ctx.lineTo(105,25);
ctx.lineTo(25,105);
ctx.closePath();
ctx.fill();
// Tringulo trazado
ctx.beginPath();
ctx.moveTo(125,125);
ctx.lineTo(125,45);
ctx.lineTo(45,125);
ctx.closePath();
ctx.stroke();
En ambos casos utilizamos dos funciones de pintado diferentes: stroke y fill . Stroke
se utiliza para dibujar una forma con contorno, mientras que fill se utiliza para pintar
una forma slida.
7.3.2 ARCOS
Para dibujar arcos o crculos se utiliza el mtodo arc (la especificacin tambin describe
el mtodo arcTo ). Este mtodo toma cinco parmetros: x e y , el radio, startAngle y
endAngle (que definen los puntos de inicio y final del arco en radianes) y anticlockwise
(un valor booleano que, cuando tiene valor true dibuja el arco de modo levgiro y
viceversa cuando es false ).
Un ejemplo algo ms complejo que los anteriores utilizando el mtodo arc sera:
for(var i=0;i<4;i++){
for(var j=0;j<3;j++){
ctx.beginPath();
var x var y
= 25+j*50;
var radius
= 25+i*50;
var startAngle var endAngle
= 20;
var anticlockwise
= 0;
//
//
//
//
coordenada x
coordenada y
radio del arco
punto inicial del crculo
180;
7.3.3MTODO MOVETO
Disponemos de la funcin moveTo , que en realidad, aunque no dibuja nada, podemos
imaginrnosla como 'si levantas un lpiz desde un punto a otro en un papel y lo colocas
en el siguiente'. Esta funcin es utilizada para colocar el punto de partida en otro lugar o
para dibujar rutas inconexas.
ctx.beginPath();
ctx.arc(75,75,50,0,Math.PI*2,true);
http://www.arkaitzgarro.com/html5/capitulo-7.html[13/07/2015 12:00:24]
// crculo exterior
ctx.closePath();
ctx.fill();
ctx.fillStyle = '#FFF';
ctx.beginPath(); ctx.arc(75,75,35,0,Math.PI,false); ctx.closePath();
ctx.fill();
// boca (dextrgiro)
ctx.moveTo(65,65);
ctx.beginPath();
ctx.arc(60,65,5,0,Math.PI*2,true);
ctx.closePath();
ctx.fill();
// ojo izquierdo
ctx.moveTo(95,65);
ctx.beginPath();
ctx.arc(90,65,5,0,Math.PI*2,true);
ctx.closePath();
ctx.fill();
// ojo derecho
7.4 COLORES
Si queremos aplicar colores a una forma, hay dos caractersticas importantes que
podemos utilizar: fillStyle y strokeStyle .
fillStyle = color
strokeStyle = color
strokeStyle se utiliza para configurar el color del contorno de la forma y fillStyle es
para el color de relleno. Color puede ser una cadena que representa un valor de color
CSS, un objeto degradado o un objeto modelo.
http://www.arkaitzgarro.com/html5/capitulo-7.html[13/07/2015 12:00:24]
Ejemplo de fillStyle :
function draw() {
for (var i=0;i<6;i++){
for (var j=0;j<6;j++){
ctx.fillStyle = 'rgb(' + Math.floor(255-42.5*i) + ','
+ Math.floor(255-42.5*j) + ',0)';
ctx.fillRect(j*25,i*25,25,25);
}
}
}
Ejemplo de strokeStyle :
function draw() {
for (var i=0;i<6;i++){
for (var j=0;j<6;j++){
ctx.strokeStyle = 'rgb(0,' +
Math.floor(255-42.5*i)
+ ',' + ath.floor(255-42.5*j) + ')';
ctx.beginPath();
ctx.arc(12.5+j*25,12.5+i*25,10,0,Math.PI*2,true);
ctx.stroke();
}
}
}
El cdigo anterior creamos un degradado lineal al que aplicamos dos pasos de color. Los
argumentos de createLinearGradient son el punto de inicio del degradado ( x1 e y1 )
y el punto final del degradado ( x2 e y2 ). En este caso el degradado comienza en la
esquina superior izquierda, y termina en la esquina inferior izquierda. Utilizamos este
degradado para pintar el fondo de un rectngulo.
7.6 TRANSPARENCIAS
Adems de dibujar formas opacas en el lienzo, tambin podemos dibujar formas
semitransparentes. Esto se hace mediante el establecimiento de la propiedad
globalAlpha o podramos asignar un color semitransparente al trazo y/o al estilo de
relleno.
globalAlpha = transparency
value
Esta propiedad aplica un valor de transparencia a todas las formas dibujadas en el lienzo
y puede ser til si deseas dibujar un montn de formas en el lienzo con una
transparencia similar; ya que debido a que las propiedades strokeStyle y fillStyle
aceptan valores de color CSS3, podemos utilizar la siguiente notacin para asignarles un
color transparente.
function draw() {
// dibujar fondo
ctx.fillStyle = '#FD0';
ctx.fillRect(0,0,75,75);
ctx.fillStyle = '#6C0';
ctx.fillRect(75,0,75,75);
ctx.fillStyle = '#09F';
ctx.fillRect(0,75,75,75);
ctx.fillStyle = '#F30';
ctx.fillRect(75,75,150,150);
ctx.fillStyle = '#FFF';
// establecer valor de transparencia
ctx.globalAlpha = 0.2;
// Dibujar crculos semitransparentes
for (var i=0;i<7;i++){
ctx.beginPath();
ctx.arc(75,75,10+10*i,0,Math.PI*2,true);
ctx.fill();
}
}
7.7 TRANSFORMACIONES
Al igual que tenemos la posibilidad mover el lpiz por el canvas con el mtodo moveTo
, podemos definir algunas transformaciones como rotacin, escalado, transformacin
y traslacin (similares a las conocidas de CSS3).
7.7.1MTODO TRANSLATE
ste mtodo traslada el centro de coordenadas desde su posicin por defecto (0, 0) a la
posicin indicada.
ctx.translate(x, y);
7.7.2MTODO ROTATE
ste mtodo inicia la rotacin desde su posicin por defecto (0,0). Si se rota el canvas
desde esta posicin, el contenido podra desaparecer por los lmites del lienzo, por lo que
es necesario definir un nuevo origen para la rotacin, dependiendo del resultado
deseado.
ctx.rotate(angle);
ste mtodo slo precisa tomar un parmetro, que es el ngulo de rotacin que se
aplicar al marco. Este parmetro es una rotacin dextrgira medida en radianes.
function draw()
{ ctx.translate(75,75
); for (i=1;i<6;i++){
// Desplazarse or los anillos (desde dentro hacia fuera)
ctx.save();
ctx.fillStyle = 'rgb('+(51*i)+','+(255-51*i)+',255)';
for (j=0;j<i*6;j++){
// dibujar puntos individuales
ctx.rotate(Math.PI*2/(i*6));
ctx.beginPath();
ctx.arc(0,i*12.5,5,0,Math.PI*2,true);
ctx.fill();
}
ctx.restore();
}
}
7.7.3MTODO SCALE
El siguiente mtodo de transformacin es el escalado. Se utiliza para aumentar o
disminuir las unidades del tamao de nuestro marco. Este mtodo puede usarse para
dibujar formas ampliadas o reducidas.
ctx.scale(x, y);
x e y definen el factor de escala en la direccin horizontal y vertical respectivamente.
Los valores menores que 1.0 reducen el tamao de la unidad y los valores mayores que
1.0 aumentan el tamao de la unidad. Por defecto, una unidad en el rea de trabajo
equivale exactamente a un pxel. Si aplicamos, por ejemplo, un factor de escalado de
0.5, la unidad resultante ser 0.5 pxeles, de manera que las formas se dibujarn a
mitad de su tamao.
7.8 ANIMACIONES
Como estamos utilizando scripts para controlar los elementos canvas , resulta muy fcil
hacer animaciones (interactivas). Sin embargo, el elemento canvas no fue diseado
para ser utilizado de esta manera (a diferencia de flash) por lo que existen limitaciones.
Probablemente, la mayor limitacin es que una vez que se dibuja una forma, se queda de
esa manera. Si necesitamos moverla, tenemos que volver a dibujar dicha forma y todo
lo que se dibuj anteriormente.
Los pasos bsicos a seguir son los siguientes:
1. Borrar el lienzo: a menos que las formas que se dibujen llenen el lienzo completo
(por ejemplo, una imagen de fondo), se necesitar borrar cualquier forma que se
haya dibujado con anterioridad. La forma ms sencilla de hacerlo es utilizando el
mtodo clearRect .
2. Guardar el estado de canvas : si se va a modificar alguna configuracin
(estilos, transformaciones) que afectan al estado de canvas .
3. Dibujar formas animadas: representacin del marco.
4. Restaurar el estado de canvas: restaurar el estado antes de dibujar un nuevo
marco.
7.8.1 CONTROL
Las formas se dibujan en el lienzo mediante el uso de los mtodos canvas directamente
o llamando a funciones personalizadas. Necesitamos una manera de ejecutar nuestras
funciones de dibujo en un perodo de tiempo. Hay dos formas de controlar una
animacin como sta. En primer lugar est las funciones setInterval y setTimeout ,
que se pueden utilizar para llamar a una funcin especfica durante un perodo
determinado de tiempo.
setInterval (animateShape, 500);
setTimeout (animateShape, 500);
El segundo mtodo que podemos utilizar para controlar una animacin es el input del
usuario. Si quisiramos hacer un juego, podramos utilizar los eventos de teclado o de
ratn para controlar la animacin. Al establecer EventListeners , capturamos cualquier
interaccin del usuario y ejecutamos nuestras funciones de animacin.
Ejercicio 7
Ver enunciado
NDICE DE CONTENIDOS
Canvas
Elementos bsicos
Dibujar formas
Rutas
Colores
Degradados y patrones
Transparencias
Transformaciones
Animaciones
HTML5
Anterior Siguiente
http://www.arkaitzgarro.com/html5/capitulo-8.html[13/07/2015 12:00:29]
Nota
Cuando hacemos referencia la ventana o pestaa, nos estamos refiriendo al objeto
window. Una nueva ventana abierta utilizando el mtodo window.open(), pertenece
a la misma sesin.
Tanto sessionStorage como localStorage forman parte del Web Storage, por lo que
comparten el mismo API:
readonly attribute unsigned long length;
getter DOMString key(in unsigned long index);
getter DOMString getItem(in DOMString key);
setter creator void setItem(in DOMString key, in any data);
deleter void removeItem(in DOMString key);
void clear();
Este API hace que sea muy sencillo acceder a los datos. El mtodo setItem almacena el
valor, y el mtodo getItem lo obtiene, como se muestra a continuacin:
sessionStorage.setItem('twitter', '@starkyhach');
alert( sessionStorage.getItem('twitter') ); // muestra
@starkyhach
Es importante darse cuenta, que tal y como se indica en el API, el mtodo getItem
siempre devuelve un String, por lo que si intentamos almacenar un objeto, el valor
devuelto ser "[Object object]". El mismo problema ocurre con los nmero, por lo que es
importante tenerlo en cuenta para evitar posibles errores. Por ejemplo:
sessionStorage.setItem('total', 120);
function calcularCosteEnvio(envio) {
return sessionStorage.getItem('total') +
}
envio;
alert(calcularCosteEnvio(25));
En este caso, esperamos que el coste total (120) se almacene como nmero, y al aadir
el coste del envo, el resultado sea 145. Pero como sessionStorage devuelve un String,
el resultado no es el esperado sino 12025.
ELIMINANDO DATOS
Disponemos de tres formas de eliminar datos del almacenamiento local: utilizando
delete , removeItem y clear . El mtodo removeItem toma como parmetro el nombre
de la clave a eliminar (el mismo que utilizamos en getItem y setItem ), para eliminar un
tem en particular. Por su parte, el mtodo clear , elimina todas las entradas del objeto.
sessionStorage.setItem('twitter',
'@starkyhach');
sessionStorage.setItem('flickr', 'starky.hach');
alert( sessionStorage.length ); sessionStorage.removeItem('twitter'); alert( sessionStorage.length
); se
// Mue
alert( sessionStorage.length );
// Mue
// Mue
{
DOMString key;
any oldValue;
any newValue;
DOMString url;
Storage storageArea;
Ejercicio 8
Ver enunciado
Debido a la naturaleza de estas llamadas, significa que el API de Web SQL es asncrono,
por lo que es necesario tener cuidado con el orden en el que se ejecutan las sentencias
SQL. Sin embargo, las sentencias SQL se encolan y son ejecutadas en orden, por lo que
podemos estar tranquilos en ese sentido: podemos crear tablas y tener la seguridad que
van a ser creadas antes de acceder a los datos.
sentencias SQL. Al abrir la base de datos por primera vez, sta es creada
automticamente. Es necesario especificar el nmero de versin de base de datos con el
que se desea trabajar, y si no especificamos correctamente ste nmero de versin, es
posible que provoquemos un error del tipo INVALID_STATE_ERROR .
var db = openDatabase('mydb', '1.0', 'My first database', 2 * 1024 *
1024);
8.2.2 TRANSACCIONES
Ahora que tenemos la base de datos abierta, podemos crear transacciones para ejecutar
nuestras sentencias SQL. La idea de utilizar transacciones, en lugar de ejecutar las
sentencias directamente, es la posibilidad de realizar rollback. Esto quiere decir, que si la
transaccin falla por algn motivo, se vuelve al estado inicial, como si nada hubiese
pasado.
db.transaction(function (tx)
{ tx.executeSql('DROP TABLE
foo');
// known to fail - so should rollback the DROP statement
tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "foobar")');
}, function (err)
{ alert(err.message
);
Una vez listo el objeto transaccin ( tx en el ejemplo), podemos ejecutar sentencias SQL.
db.transaction(function (tx) {
tx.executeSql(sqlStatement, arguments, callback,
});
errorCallback);
Donde:
1. sqlStatement : indica la sentencia SQL a ejecutar. Como hemos dicho, puede ser
cualquier tipo de sentencia; creacin de tabla, insertar un registro, realizar una
consulta, etc.
2. arguments : corresponde con un array de argumentos que pasamos a la sentencia
SQL. Es recomendable pasar los argumentos a la sentencia de esta manera, ya que
el propio mtodo se ocupa de prevenir inyecciones SQL.
3. callback : funcin a ejecutar cuando la transaccin se ha realizado de
manera correcta. Toma como parmetros la propia transaccin y el resultado
de la transaccin.
4. erroCallback : funcin a ejecutar cuando la transaccin se ha producido un error
en la sentencia SQL. Toma como parmetros la propia transaccin y el error
producido.
Un ejemplo de seleccin de registros sera el siguiente:
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM foo WHERE id = ?', [5],
function callback(tx, results) {
var len = results.rows.length, i;
for (i = 0; i < len; i++) {
alert(results.rows.item(i).text);
}
},
function errorCallback(tx, error) {
alert(error.message);
}
);
});
campo que se llama nombre, podemos acceder a dicho campo de la siguiente manera:
results.rows.item(i).nombre
La primera tarea a realizar cuando trabajamos con una base de datos es crear las tablas
necesarias para almacenar los datos. Como hemos comentado antes, este proceso se
realiza a travs de una sentencia SQL, dentro de una transaccin. Vamos a crear una
base de datos para almacenar tweets que posteriormente obtendremos de internet:
db = openDatabase('tweetdb', '1.0', 'All my tweets', 2 * 1024 * 1024);
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS tweets(id, user, date, text)',
, getTweets);
});
[]
Nota
Insertando cada tweet en una nueva transaccin, nos aseguramos que si se
produce un error en alguna de ellas (ya exista el tweet), se van a seguir
ejecutando el resto transacciones.
'</l
i>');
}
tweetEl.innerHTML =
html.join('');
});
});
Ejercicio 9
Ver enunciado
8.3 INDEXEDDB
IndexedDB no es una base de datos relacional, sino que se podra llamar un almacn de
En IndexedDB , al igual que en Web SQL, al abrir una base de datos debemos indicar su
nombre y la versin concreta. Posteriormente debemos crear los almacenes de objetos,
que es muy parecido a un archivador con ndices, que nos permite encontrar de una
manera muy rpida el objeto que buscamos. Una vez el almacn est listo, podemos
almacenar cualquier tipo de objeto con el ndice que definamos. No importa el tipo de
objeto que almacenemos, ni tienen que tener las mismas propiedades.
};
request.onsuccess = function (event) {
// handle version control
// then create a new object store
};
Ahora que la base de datos esta abierta (y asumiendo que no hay errores), se ejecutar
el evento onsuccess . Antes de poder crear almacenes de objetos, tenemos que tener
en cuenta los siguiente:
Necesitamos un manejador para poder realizar transacciones de insercin y
obtencin de datos.
Hay que especificar la versin de la base de datos. Si no existe una versin definida,
significa que la base de datos no est an creada.
El mtodo onsuccess recibe como parmetro un evento, al igual que lo hace cualquier
otro mtodo escuchador de eventos. Dentro de este objeto, encontramos una propiedad
llamada target , y dentro de sta otra propiedad llamada result , que contiene el
resultado de la operacin. En este caso especfico, event.target.result contiene la
base de datos que acabamos de abrir.
var db = null;
var request = indexedDB.open('videos');
request.onsuccess = function (event) {
// cache a copy of the database handle for the future
db = event.target.result;
// handle version control
// then create a new object store
};
request.onerror = function (event) {
alert('Something failed: ' + event.target.message);
};
Es importante indicar que en IndexedDB , los errores que se producen escalan hasta
el objeto request . Esto quiere decir, que si un error ocurre en cualquier peticin
(por ejemplo una consulta de datos), en este caso mostrara una alerta con el error.
code
};
Para este ejemplo, hemos creado un nico almacn de objetos, pero lo normal es
disponer de varios y que puedan relacionarse entre ellos. El mtodo createObjectStore
admite dos parmetros:
name : indica el nombre del almacn de objetos.
optionalParameters : este parmetro permite definir cual va a ser el ndice de los
objetos, a travs del cual se van a realizar las bsquedas y que por tanto debe ser
nico. Si no deseamos que este ndice se incremente automticamente al aadir
nuevos objetos, tambin lo podemos indicar aqu. Al aadir un nuevo objeto, es
importante asegurarnos que disponga de la propiedad definida como ndice, y que
});
no existe en el almacn.
var video = {
title: "Belly Dance Bruce - Final Strike",
date: (new Date).getTime(), // released TODAY!
director: "Bruce Awesome",
length: 169, // in minutes
rating: 10,
cover: "/images/wobble.jpg"
};
var myIDBTransaction =
window.IDBTransaction
|| window.webkitIDBTransaction
|| { READ_WRITE: 'readwrite' };
var transaction =
db.transaction(['blockbusters'], myIDBTransaction.READ_WRITE);
var store = transaction.objectStore('blockbusters');
// var request = store.add(video);
var request = store.put(video);
Analizemos las tres ltimas lneas, utilizadas para aadir un nuevo objeto al almacn:
1. transaction = db.transaction(['blockbusters'], READ_WRITE) : creamos una
nueva transaccin de lectura/escritura, sobre los almacenes indicados (en este caso
slo 'blockbusters'), pero podran ser varios si es necesario. Si no necesitamos que
la transaccin sea de escritura, podemos indicarlo con la propiedad
IDBTransaction.READ_ONLY. .
2. store = transaction.objectStore('blockbusters') : obtenemos el almacn de
objetos sobre el que queremos realizar las operaciones, que debe ser uno de los
indicados en la transaccin. Con la referencia a este objeto, podemos ejecutar las
operaciones de add , put , get , delete , etc.
3. request
store.put(video)
En este caso, lo importante es que la clave (la variable key ) que hemos pasado al
mtodo get , buscar el valor que contiene en la propiedad que hemos definido
como keyPath al crear el almacn de objetos.
** Nota **
En ese ejemplo, abrimos el almacn de objetos al igual que lo hemos venido haciendo,
pero en lugar de obtener un nico objeto con el mtodo get , abrimos un cursor. Esto
nos permite iterar por los objetos devueltos por el cursor, todos como es este caso, o los
que cumplan una condicin concreta. El objeto en concreto al que apunta el cursor en la
iteracin actual se encuentra almacenado en su propiedad cursor.value . Avanzar en el
cursor, para obtener el siguiente objeto, es tan sencillo como llamar al mtodo
continue() del cursor, lo que provocar una nueva llamada al evento onsuccess , siendo
nosotros los que tenemos que controlar si el cursor ya no apunta a ningn objeto
( cursor === false ).
|| window.webkitIDBTransaction
|| { READ_WRITE: 'readwrite' };
var transaction =
db.transaction(['blockbusters'], myIDBTransaction.READ_WRITE);
var store = transaction.objectStore('blockbusters');
var request = store.delete(key);
Ejercicio 10
Ver enunciado
NDICE DE CONTENIDOS
Almacenamiento local
Web Storage
Web SQL
IndexedDB
HTML5
Anterior Siguiente
http://www.arkaitzgarro.com/html5/capitulo-9.html[13/07/2015 12:01:18]
El atributo manifest debe estar incluido en todas las pginas de nuestra aplicacin, que
queramos que se almacenen en la cach. Es decir, adems de los ficheros indicados en
el manifiesto, la propia pgina que incluye el manifiesto es almacenada en la cach. El
navegador no almacenar en cach ninguna pgina que no contenga el atributo
manifest (a menos que esa pgina aparezca explcitamente en el propio archivo de
manifiesto).
El atributo manifest puede sealar a una URL absoluta o a una ruta relativa, pero las
URL absolutas deben tener el mismo origen que la aplicacin web. Un archivo de
manifiesto puede tener cualquier extensin, pero se debe mostrar con el tipo MIME
correcto:
<html manifest="http://www.example.com/example.mf">
...
</html>
El tipo MIME con el que se deben mostrar los archivos de manifiesto es text/cachemanifest . Es posible que se tenga que aadir un tipo de archivo personalizado a la
9.1.1 ESTRUCTURA
Ejemplo de un archivo de manifiesto sencillo:
CACHE MANIFEST
index.html
stylesheet.css
images/logo.png
scripts/main.js
El archivo de manifiesto del ejemplo permite almacenar en cach los cuatro archivos
especificados. El formato del manifiesto es importante:
La cadena CACHE MANIFEST debe aparecer en la primera lnea y es obligatoria.
Dentro del manifiesto, los ficheros son listados dentro de categoras, tambin
conocidos como namespaces . Si no se especifica ninguna categora, todos
los ficheros pertenecen a la categora CACHE .
Un ejemplo ms complejo sera:
CACHE MANIFEST
# 2010-06-18:v2
CACHE:
/favicon.ico
index.html
stylesheet.css
images/logo.png
scripts/main.js
# Resources that require the user to be online.
NETWORK:
login.php
/myapi
http://api.twitter.com
# static.html will be served if main.py is inaccessible
# offline.jpg will be served in place of all images in images/large/
# offline.html will be served in place of all other .html files
FALLBACK:
/main.py /static.html
images/large/ images/offline.jpg
*.html /offline.html
online.
NETWORK:
*
# Additional resources to cache
CACHE:
images/logo1.png
images/logo2.png
images/logo3.png
Nota
Las peticiones de recursos que den como resultado un error 404 (por ejemplo una
imagen no encontrada), mostrarn en este caso el fichero offline.html
Esta configuracin depender del servidor web que utilicemos. De todas maneras, para
asegurarnos que el servidor est enviando el manifiesto con la cabecera correcta,
podemos utilizar una herramienta como curl de la siguiente manera:
curl -I
http://mysite.com/manifest.appcache
text/cache-manifest
Para actualizar la cach mediante JavaScript, primero se debe hacer una llamada a
applicationCache.update() . Al hacer esa llamada, se intentar actualizar la cach del
usuario (para lo cual ser necesario que haya cambiado el archivo de manifiesto).
Finalmente, cuando el estado de applicationCache.status sea UPDATEREADY , al llamar a
applicationCache.swapCache() , se sustituir la antigua cach por la nueva.
var appCache = window.applicationCache;
appCache.update(); // Attempt to update the user's
cache.
if (appCache.status == window.applicationCache.UPDATEREADY)
{ appCache.swapCache(); // The fetch was successful, swap in the new
cache.
Hay, adems, algunos eventos adicionales que permiten controlar el estado de la cach.
El navegador activa eventos para una serie de acciones (como el progreso de las
descargas, la actualizacin de la cach de las aplicaciones y los estados de error). El
siguiente fragmento permite establecer escuchadores de eventos para cada tipo de
evento de cach:
function handleCacheEvent(e)
{}
function handleCacheError(e)
{ alert('Error: Cache failed to
update!');
};
// Fired after the first cache of the manifest.
appCache.addEventListener('cached', handleCacheEvent, false);
appCache.addEventListener('checking',
handleCacheEvent, false);
setOnline(true);
Y offline.js contiene:
setOnline(false);
En nuestra aplicacin, creamos una funcin llamada testOnline que dinmicamente crea
un elemento <script> , el cual trata de cargar el fichero online.js . Si la carga se
realiza de manera correcta, se ejecuta el mtodo setOnline(true) . Si estamos offline,
el navegador cargar el fichero offline.js , ejecutando el mtodo setOnline(false) .
function testOnline(fn) {
var script = document.createElement(script)
script.src = 'online.js';
// alias the setOnline function to the new function that was passed in
window.setOnline = function (online) {
document.body.removeChild(script);
fn(online);
};
// attaching script node trigger the code to run
document.body.appendChild(script);
}
testOnline(function (online) {
if (online) {
applicationCache.update();
} else {
// show users an unobtrusive message that they're
}
});
Ejercicio 11
Ver enunciado
NDICE DE CONTENIDOS
Sin conexin
El archivo de manifiesto de cach
Cmo servir el manifiesto
Proceso de cacheado
Actualizacin de la memoria cach
Eventos online/offline
disconnected
HTML5
Anterior Siguiente
DnD.
http://www.arkaitzgarro.com/html5/capitulo-10.html[13/07/2015 12:01:23]
Una ayuda visual al usuario, para indicar que un elemento es arrastable, es transformar
el aspecto tanto del elemento como del cursor. Con CSS esto es muy sencillo:
[draggable] {
user-select: none;
}
.column:hover {
border: 2px dotted #666666;
background-color: #ccc;
border-radius: 10px;
box-shadow: inset 0 0 3px #000;
cursor: move;
}
que est siendo arrastrado. Este evento se dispara tantas veces como se mueva el
elemento.
dragenter : se dispara cuando un elemento que est siendo arrastrado entra en
}
function handleDragOver(e) {
if (e.preventDefault) {
e.preventDefault(); // Necessary. Allows us to
}
e.dataTransfer.dropEffect = 'move';
return false;
}
drop.
function handleDragEnter(e) {
// this / e.target is the current hover target.
this.classList.add('over');
}
function handleDragLeave(e) {
this.classList.remove('over');
nt.
}
eleme
http://www.arkaitzgarro.com/html5/capitulo-10.html[13/07/2015 12:01:23]
redirecting.
}
function handleDragEnd(e) {
// this/e.target is the source node.
[].forEach.call(cols, function (col)
col.classList.remove('over');
});
}
function handleDrop(e) {
// this/e.target is current target element.
if (e.stopPropagation) {
e.stopPropagation(); // Stops some browsers from redirecting.
}
// Don't do anything if dropping the same column we're dragging.
if (dragSrcEl != this) {
// Set the source column's HTML to the HTML of the columnwe dropped
on.
dragSrcEl.innerHTML = this.innerHTML;
this.innerHTML = e.dataTransfer.getData('text/html');
}
return false;
}
Hemos aadido una variable global llamada dragSrcEl para facilitar el cambio de
posicin de la columna. En handleDragStart() , la propiedad innerHTML de la columna
de origen se almacena en esa variable y, posteriormente, se lee en handleDrop() para
cambiar el HTML de las columnas de origen y destino.
Ejercicio 12
Ver enunciado
NDICE DE CONTENIDOS
Geolocalizacin | HTML5
HTML5
Anterior Siguiente
CAPTULO 11 GEOLOCALIZACIN
El uso del API de geolocalizacin es extremadamente sencillo. Soportado por todos los
navegadores modernos, nos permite conocer la posicin del usuario con mayor o menor
precisin, segn el mtodo de localizacin utilizado. En la actualidad, disponemos de tres
tecnologas para geolocalizar un usuario:
Va IP: todo dispositivo que se encuentra conectado a la red, tiene asignada una
direccin IP (Internet Protocol) pblica que acta, de forma muy simplificada, como
un cdigo postal. Evidentemente, esta no es la mejor manera de localizacin, pero
s nos da una ligera idea de dnde se encuentra.
Redes GSM: cualquier dispositivo que se conecte a una red telefona, es capaz de
obtener una posicin aproximada basndose en una triangulacin con las antenas
de telefona. Es un mtodo sensiblemente ms preciso que mediante la direccin IP,
pero mucho menos que mediante GPS.
GPS: Global Positioning System o Sistema de Posicionamiento Global. Es el mtodo
ms preciso, pudiendo concretar la posicin del usuario con un margen de error de
escasos metros.
El primer paso es comprobar es la disponibilidad del API de geolocalizacin de HTML 5 en
el explorador del usuario:
if(Modernizr.geolocation) {
alert('El explorador soporta geolocalizacin');
} else {
alert('El explorador NO soporta geolocalizacin');
}
El API ofrece los siguientes mtodos para geolocalizar la posicin del usuario:
getCurrentPosition : obtiene la posicin actual del usuario, utilizando la
http://www.arkaitzgarro.com/html5/capitulo-11.html[13/07/2015 12:02:07]
permiso, el API llama a la funcin de error que hayamos definido. La especificacin dice:
"El navegador no debe enviar informacin sobre la localizacin a sitios sin el
permiso explcito del usuario."
As pues, queda en manos de los navegadores informar al usuario que estamos
intentando acceder a su posicin actual. La forma de realizarlo depende del navegador.
Por norma general, los navegadores de escritorio muestran un aviso no bloqueante, lo
que permite seguir utilizando y ejecutando la aplicacin.
Figura 11.2 Peticin para compartir localizacin en Safari Mobile y Chrome Mobile
Geolocalizacin | HTML5
latitude
longitude
accuracy
Geolocalizacin | HTML5
Existe otro tipo de datos dentro del objeto coords , para dispositivos que dispongan
de GPS, aunque la gran mayora de navegadores establecern estas propiedades
como null .
readonly attribute double
altitude
altitudeAccuracy
heading
speed
:-(";
},
{ enableHighAccuracy: true }
);
code
message
2)
TIMEOUT (valor = 3)
Por ejemplo, para solicitar una alta precisin, un timeout de dos segundos y no cachear
las peticiones, llamamos al mtodo getCurrentPosition con las siguientes opciones:
navigator.geolocation.getCurrentPosition(success, error,
{ enableHighAccuracy: true
timeout: 2000
maximumAge: 0
});
Ejercicio 13
Ver enunciado
NDICE DE CONTENIDOS
Geolocalizacin
11.1 Mtodos del API
HTML5
Anterior Siguiente
Worker('task.js');
http://www.arkaitzgarro.com/html5/capitulo-12.html[13/07/2015 12:02:15]
A continuacin, se muestra un ejemplo sobre cmo utilizar una cadena para transferir
"Hello World" a un Worker en doWork.js . El Worker simplemente devuelve el
mensaje que se le transfiere.
Secuencia de comandos principal:
worker.postMessage('Hello World'); // Send data to our
worker.
'Hi'});
}
function stop() {
worker.postMessage({'cmd': 'stop', 'msg':
}
'Bye'});
function unknownCmd() {
worker.postMessage({'cmd': 'foobard', 'msg':
}
var worker = new
'???'});
Worker('doWork.js');
worker.addEventListener('message', function(e)
{ document.getElementById('result').textContent
e.data;
}, false);
</script>
doWork.js:
this.addEventListener('message', function(e) {
var data = e.data;
switch (data.cmd) {
case 'start':
this.postMessage('WORKER STARTED: '+data.msg);
break;
case 'stop':
this.postMessage('WORKER STOPPED: '+data.msg+'. (buttons will no lo
nger work)');
this.close(); // Terminates the worker.
break;
default:
this.postMessage('Unknown command: '+data.msg);
};
}, false);
Crear nuevo Worker es muy sencillo. Tan slo tenemos que crear una nueva instancia del
objeto Worker , indicando como parmetro del constructor el fichero JavaScript que
contiene el cdigo que debe ejecutar el Worker.
var worker = new
Worker('my_worker.js');
De esta manera tenemos disponible y listo para utilizar un nuevo Worker. En este
momento, podramos pensar que podemos llamar a mtodos o utilizar objetos definidos
dentro del nuevo Worker, pero no nada ms lejos de la realidad. La nica manera de
comunicarnos con el nuevo Worker es a travs del paso de mensajes, como hemos visto
anteriormente.
worker.postMessage('Hello
World');
Objeto window .
Objeto document
. Objeto parent .
12.3 SUBWORKERS
Los Workers tienen la capacidad de generar Workers secundarios. Esto significa, que
podemos dividir la tarea principal en subtareas, y crear nuevos Workers dentro del
Worker principal. Sin embargo, a la hora de utilizar los Subworkers, y antes de poder
devolver el resultado final al hilo principal, es necesario asegurarse que todos los
procesos han terminado.
var pendingWorkers = 0, results =
{},;
}
}
function storeResult(event) {
var result = JSON.parse(event.data);
pendingWorkers--;
if (pendingWorkers <= 0)
{ postMessage(JSON.stringify(results)
);
}
}
red;"></output>
<script>
function onError(e)
{ document.getElementById('error').textContent =
[
'ERROR: Line ', e.lineno, ' in ', e.filename, ': ',
;
}
function onMsg(e)
{ document.getElementById('result').textContent
e.data;
}
e.message].join('')
workerWithError.js:
self.addEventListener('message', function(e)
{ postMessage(1/x); // Intentional error.
};
12.5 SEGURIDAD
Debido a las restricciones de seguridad de Google Chrome (otros navegadores no aplican
esta restriccin), los Workers no se ejecutarn de forma local (por ejemplo, desde
file:// ) en las ltimas versiones del navegador. En su lugar, fallan de forma
automtica. Para ejecutar tu aplicacin desde el esquema file:// , ejecuta Chrome con
el conjunto de marcadores --allow-file-access-from-files .
Las secuencias de comandos del Worker deben ser archivos externos con el mismo
esquema que su pgina de llamada. Por ello, no se puede cargar una secuencia de
comandos desde una URL data: o una URL javascript: . Asimismo, una pgina https:
no puede iniciar secuencias de comandos de Worker que comiencen con una URL http: .
Ejercicio 14
Ver enunciado
NDICE DE CONTENIDOS
Web workers
Transferencia de mensajes
Utilizacin de Web Workers
Subworkers
Gestionar errores
Seguridad
WebSockets | HTML5
HTML5
Anterior Siguiente
CAPTULO 13 WEBSOCKETS
13.1 INTRODUCCIN
Internet se ha creado en gran parte a partir del llamado paradigma solicitud/respuesta
de HTTP. Un cliente carga una pgina web, se cierra la conexin y no ocurre nada hasta
que el usuario hace clic en un enlace o enva un formulario.
Hace ya algn tiempo que existen tecnologas que permiten al servidor enviar datos al
cliente en el mismo momento que detecta que hay nuevos datos disponibles. Se conocen
como "Push" o "Comet". Uno de los trucos ms comunes para crear la ilusin de una
conexin iniciada por el servidor se denomina Long Polling. Con el Long Polling, el cliente
abre una conexin HTTP con el servidor, el cual la mantiene abierta hasta que se enve
una respuesta. Cada vez que el servidor tenga datos nuevos, enviar la respuesta. El
Long Polling y otras tcnicas funcionan bastante bien y de hecho ha sido utilizadas en
muchas aplicaciones como el chat de Gmail.
Los WebSockets nos ofrecen una conexin bidireccional entre el servidor y el navegador.
Esta conexin se produce en tiempo real y se mantiene permanentemente abierta hasta
que se cierre de manera explcita. Esto significa que cuando el servidor quiere enviar
datos al servidor, el mensaje se traslada inmediatamente. Efectivamente, esto es lo que
suceda al utilizar tecnologas como Comet, pero se consegua utilizando una serie de
trucos. Si esto no funcionada, siempre era posible utilizar Ajax para conseguir un
resultado parecido, pero sobrecargando el servidor de manera innecesaria.
Si disponemos de un socket abierto, el servidor puede enviar datos a todos los clientes
conectados a ese socket, sin tener que estar constantemente procesando peticiones de
Ajax. La ventaja en cuanto a rendimiento y escalabilidad es bastante evidente al utilizar
WebSockets.
La latencia en las comunicaciones es otro de los beneficios de utilizar WebSockets. Como
el socket est siempre abierto y escuchando, los datos son enviados inmediatamente
desde el servidor al navegador, reduciendo el tiempo al mnimo, en comparacin con un
paradigma basado en Ajax, donde hay que realizar una peticin, procesar la respuesta y
enviarla de nuevo de vuelta.
Finalmente, los datos a transmitir se reducen tambin de manera drstica, pasando de
un mnimo de 200-300 bytes en peticiones Ajax, a 10-20 bytes utilizando websockets.
WebSocket('ws://html5rocks.websocket.org/tweets');
WebSockets");
El API incorpora adems dos eventos que se disparan cuando el socket se abre y est
listo, y cuando ste se va a cerrar:
socket.onopen = function(e){ log("Welcome - status "+this.readyState); };
socket.onclose = function(e){ log("Disconnected - status "+this.readyState);
};
NDICE DE CONTENIDOS
WebSockets
Introduccin
Crear un WebSocket
Comunicacin con el servidor
WebSocket en el servidor
EventSource | HTML5
HTML5
Anterior Siguiente
CAPTULO 14 EVENTSOURCE
Los EventSource (tambin conocidos como Server-Sent Events), son eventos en tiempo
real transmitidos por el servidor y recibidos en el navegador. Son similares a los
WebSockets en que suceden el tiempo real, pero son principalmente un mtodo de
comunicacin unidireccional desde el servidor. Al igual que en los WebSocket, creamos
una nueva conexin indicando la URL, y el navegador intentar conectarse
inmediatamente. El objeto EventSource dispone de los siguientes eventos:
open : se dispara cuando la conexin se ha establecido.
message : evento que indica la llegada de un mensaje
EventSource('/bidding');
es.onopen = function () {
initialiseData();
};
es.onmessage = function (event) {
var data = JSON.parse(event.data);
updateData(data.time, data.bid);
};
http://www.arkaitzgarro.com/html5/capitulo-14.html[13/07/2015 12:02:45]
Una aplicacin muy simple, pero que nos da una idea del funcionamiento de los eventos
en tiempo real, utilizando un servidor basado en eventos.
NDICE DE CONTENIDOS
EventSource
14.1 EventSource en el servidor
File | HTML5
HTML5
Anterior Siguiente
CAPTULO 15 FILE
HTML5 ofrece una forma estndar de interactuar con archivos locales a travs de la
especificacin del API de archivos. El API de archivos se puede utilizar, por ejemplo, para
crear una vista previa en miniatura de imgenes mientras se envan al servidor o para
permitir que una aplicacin guarde una referencia de un archivo mientras el usuario se
encuentra sin conexin. Tambin se podra utilizar para verificar si el tipo MIME de un
archivo seleccionado por el usuario coincide con los formatos de archivo permitidos o
para restringir el tamao de un fichero, antes de enviarlo al servidor.
A continuacin se indican las interfaces que ofrece la especificacin para acceder a
archivos desde un sistema de archivos local:
File : representa un archivo local y proporciona informacin nicamente de
lectura (el nombre, el tamao del archivo, el tipo MIME y una referencia al
manejador del archivo).
FileList : representa un conjunto de objetos File (tanto para un conjunto de
Cuando se utiliza junto con las estructuras de datos anteriores, el API de FileReader se
puede utilizar para leer un archivo de forma asncrona mediante el control de eventos de
JavaScript. Por lo tanto, se puede controlar el progreso de una lectura, detectar si se
han producido errores y determinar si ha finalizado una carga de un fichero. El modelo
de evento de FileReader guarda muchas semejanzas con el API de XMLHttpRequest .
http://www.arkaitzgarro.com/html5/capitulo-15.html[13/07/2015 12:02:50]
/>
object
'n
handleFileSelect, false);
se lanza el evento onload y se puede utilizar su atributo result para acceder a los
datos del archivo.
A continuacin se indican las cuatro opciones de lectura asncrona de archivo que incluye
FileReader :
FileReader.readAsBinaryString(Blob|File) : la propiedad result contendr los
datos del archivo/objeto BLOB en forma de cadena binaria. Cada byte se representa
con un nmero entero comprendido entre 0 y 255 , ambos incluidos.
FileReader.readAsText(Blob|File, opt_encoding) : la propiedad result contendr
/>
object
files.addEventListener('change',
handleFileSelect, false);
NDICE DE CONTENIDOS
File
File | HTML5
Deteccin de la funcionalidad
Acceso a travs del formulario
Cmo leer archivos
Fragmentacin de archivos
History | HTML5
HTML5
Anterior Siguiente
CAPTULO 16 HISTORY
El API history de HTML es la manera estndar de manipular el historial de navegacin a
travs de JavaScript. Partes de esta API ya se encontraban disponibles en versiones
anteriores de HTML. Ahora, HTML5 incluye una nueva manera de aadir entradas al
historial de navegacin, modificando la URL pero sin actualizar la pgina actual, y
eventos que se disparan cuando el usuario a eliminado estas entradas, pulsando el
botn de volver del navegador. Esto quiere decir que la barra de direcciones sigue
funcionando de la misma manera, identificando los recursos de manera nica, an
cuando las aplicaciones hacen un uso intensivo de JavaScript sin recargar la pgina.
Como sabemos, una URL representa un recurso nico. Podemos enlazarlo directamente,
almacenarlo como favorito, los motores de bsqueda pueden analizar su contenido,
podemos copiarlo y enviarlo por email... La URL realmente importa.
As pues, lo que queremos es que contenidos nicos dispongan de una URL nica. Hasta
ahora, el comportamiento normal de los navegadores recargar de nuevo la pgina si
modificbamos la URL, realizando una nueva peticin y obteniendo de nuevo todos los
recursos del servidor. No haba manera de decir al navegador que cambiase la URL pero
descargase nicamente la mitad de la pgina. El API history de HTML5 permite
precisamente esto. En lugar de solicitar la carga de toda la pgina, podemos utilizar
JavaScript para cargar nicamente los contenidos que deseemos.
La idea es la siguiente. Imaginemos que tenemos una pgina A y otra pgina B, que
comparten el 90% de su contenido. Cuando un usuario se encuentra en la pgina A, y
quiere navegar a la B, lo normal es realizar una peticin completa. En lugar de realizar
esta peticin, interrumpimos esta navegacin y realizamos los siguientes pasos de
manera manual:
1. Cargar el 10% de contenido diferente de la pgina B, a travs de algn mtodo
como AJAX.
2. Cambiar el contenido, utilizando innerHTML u otros mtodos del DOM. Es posible
que tengamos que reiniciar los eventos asociados a los elementos.
3. Actualizamos la URL del navegador, indicando la direccin de la pgina B, utilizando
el API history de HTML5.
Tras realizar estos pasos, disponemos de un DOM exacto al de la pgina B, como si
hubisemos navegado hasta ella, pero sin realizar una peticin completa.
http://www.arkaitzgarro.com/html5/capitulo-16.html[13/07/2015 12:02:58]
16.1 API
El API de HTML4 ya inclua algunos mtodos bsicos para movernos a travs del historial
de navegacin, como eran history.back(); , history.forward() y history.go(n) . Sin
embargo, estos mtodos no permitan modificar la pila del historial, por lo que no eran
de gran utilidad. HTML5 ha introducido dos nuevos mtodos que nos permiten aadir y
modificar las entradas del historial, concretamente history.pushState() y
history.replaceState() . Adems de estos mtodos, se ha aadido tambin un evento
window.onpopstate , que es lanzado cada vez que alguna de las entradas de history
cambia.
16.1.1MTODO PUSHSTATE()
Supongamos que estamos visitando http://www.arkaitzgarro.com/html5/index.html y
a travs de un script realizamos la siguiente operacin:
var stateObj = { foo: "bar" };
history.pushState(stateObj, "Demos", "demos.html");
ser index.html , pero deberemos realizar un trabajo extra al lanzarse el evento para
mostrar el contenido correcto.
El mtodo pushState() toma tres parmetros: un objeto de estado, un ttulo y una URL:
El objeto de estado: es un objeto de JavaScript asociado con la nueva entrada del
historial creada con pushState() . Cada vez que el usuario navega al estado
creado, el evento popstate es disparado, y la propiedad state del evento contiene
una copia de este objeto. Este objeto puede representar cualquier que se pueda
serializar. Como este objeto se almacena en el disco, es posible recuperarlo aunque
el navegador se cierre. Los navegadores imponen un lmite de tamao a la hora de
almacenar estados (en el caso de Firefox 640KB ). Si se necesita ms espacio, es
recomendable utilizar sessionStorage o localStorage .
El ttulo: representa el nuevo ttulo de la pgina a la que navegamos.
La nueva URL: corresponde con la nueva URL que se aade al historial de
navegacin. Esta URL puede ser absoluta o relativa, la nica restriccin es que
corresponda al dominio del documento actual. Si no se especifica este parmetro, la
URL corresponde con el documento actual.
"#foo" , ya que en ambos casos se crea y activa una nueva entrada en el historial
asociada con el documento actual. Pero pushState() ofrece las siguientes ventajas:
La nueva URL puede ser cualquier URL dentro del dominio actual. En cambio,
window.location = "#foo" se mantiene siempre en el documento actual.
No es necesario cambiar la URL actual para aadir una nueva entrada y almacenar
datos asociados.
Podemos asociar datos a una nueva entrada en el historial. Con el enfoque basado
en hash (#), los datos tenemos que aadirlos a la URL.
16.1.2MTODO REPLACESTATE()
El mtodo history.replaceState() funciona de manera similar a history.pushState() ,
a excepcin de que replaceState() modifica la entrada actual del historial, en lugar de
aadir una nueva. ste mtodo es til cuando queremos actualizar el objeto de estado
de la entrada actual en respuesta a una accin del usuario.
16.1.3EVENTO POPSTATE
El evento popstate es lanzado cada vez que la entrada actual del historial cambia por
otra entrada existente en el mismo documento. Si la entrada del historial que est
siendo activada fue creada a travs de history.pushState() o se modific con
history.replaceState() , el evento popstate recibe como parmetro una copia del
JSON.stringify(event.state));
Cuando la pgina se carga, por ejemplo al reiniciar el navegador, tango Chrome como
Safari lanzan el evento popstate , pero no es el caso de Firefox. Sin embargo, en
este caso, es posible acceder a los datos almacenados en pushState desde la
propiedad state del objeto history .
window.onload = function() {
var currentState = history.state;
}
NDICE DE CONTENIDOS
History
16.1 API
XMLHttpRequest2 | HTML5
HTML5
Anterior Siguiente
CAPTULO 17 XMLHTTPREQUEST2
XMLHttpRequest forma parte de las mejoras incrementales que los creadores de
navegadores estn implementando a la plataforma base.
XMLHttpRequest de nivel 2 introduce una gran cantidad de nuevas funciones que ponen
fin a los problemas de nuestras aplicaciones web, como solicitudes de origen cruzado,
eventos de progreso de subidas y compatibilidad con subida/bajada de datos binarios.
Esto permite a AJAX trabajar en coordinacin con muchas de las API HTML5 ms
punteras, como API de FileSystem, el API de Web Audio y WebGL.
true);
http://www.arkaitzgarro.com/html5/capitulo-17.html[13/07/2015 12:03:03]
sino una cadena binaria que representa el archivo de imagen. Estamos engaando al
servidor para que devuelva los datos sin procesar.
xhr.responseText
bb.getBlob('image/png');
}
};
xhr.send();
|| window.webkitURL;
prefixes.
yourself.
}
};
xhr.send();
aceptar todos estos tipos: DOMString, Document, FormData, Blob, File y ArrayBuffer .
Envo de la cadena de datos: xhr.send(domstring)
sendText('test string'); function sendTextNew(txt)
{ var xhr = new XMLHttpRequest();
xhr.open('POST', '/server', true);
xhr.responseType = 'text';
xhr.onload = function(e) {
if (this.status == 200)
{ console.log(this.response
);
}
};
xhr.send(txt);
}
sendText2('test string');
function sendForm() {
var formData = new FormData();
formData.append('username', 'johndoe');
formData.append('id', 123456);
var xhr = new XMLHttpRequest();
xhr.open('POST', '/server', true);
xhr.onload = function(e) { ... };
xhr.send(formData);
}
Por supuesto, no es necesario crear un objeto <form> desde cero. Los objetos FormData
se pueden inicializar a partir de un elemento HTMLFormElement de la pgina. Por
ejemplo:
<form id="myform" name="myform"
action="/server">
'1234567890');
submitting.
}
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.onload = function(e) { ... };
xhr.send(formData);
// multipart/form-data
}
document.querySelector('input[type="file"]').addEventListener('change', functio
n(e) {
uploadFiles('/server', this.files);
}, false);
function upload(blobOrFile) {
var xhr = new XMLHttpRequest();
xhr.open('POST', '/server', true);
xhr.onload = function(e) { ... };
// Listen to the upload progress.
var progressBar = document.querySelector('progress');
xhr.upload.onprogress = function(e) {
if (e.lengthComputable) {
progressBar.value = (e.loaded / e.total) * 100;
progressBar.textContent = progressBar.value; // Fallback for
orted browsers.
}
};
xhr.send(blobOrFile);
}
unsupp
XMLHttpRequest2 | HTML5
bb.append('hello world');
upload(bb.getBlob('text/plain'));
3]);
xhr.send(uInt8Array.buffer);
}
= window.requestFileSystem
|| window.webkitRequestFil
function onError(e)
{ console.log('Error',
e);
}
var xhr = new XMLHttpRequest();
xhr.open('GET', '/path/to/image.png', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
window.requestFileSystem(TEMPORARY, 1024 * 1024, function(fs)
{ fs.root.getFile('image.png', {create: true}, function(fileEntry)
{
fileEntry.createWriter(function(writer) {
if ('mozSlice' in blob) {
var chunk = blob.mozSlice(start, end);
} else {
var chunk = blob.webkitSlice(start, end);
}
upload(chunk);
start = end;
end = start + BYTES_PER_CHUNK;
}
}, false);
})();
NDICE DE CONTENIDOS
XMLHttpRequest2
Recuperacin de archivos
Especificacin de un formato de respuesta
Envo de datos
Subida de archivos o Blob
Subida de un fragmento de bytes
Ejemplos prcticos
Ejercicios | HTML5
HTML5
Anterior Siguiente
CAPTULO 18 EJERCICIOS
18.1 CAPTULO 2
18.1.1 EJERCICIO 1
Dada la siguiente pgina web, estructurada en XHTML, aplicar las nuevas etiquetas
semnticas de HTML5 donde sea conveniente, manteniendo el mismo aspecto visual
(modificar la hoja de estilos si es necesario) y funcionalidad. Realizad tambin los
cambios necesarios en la cabecera del documento (elemento <head> ).
Descargar pgina web.
18.2 CAPTULO 3
18.2.1 EJERCICIO 2
Crear un formulario que contenga lo siguiente:
Los 12 nuevos tipos de elementos input .
El nuevo elemento datalist , que contenga algunos nombres de provincia y
un campo de texto que se relacione con l.
Una caja de texto (<input type="text"> ), a la cual aplicar los atributos autofocus ,
placeholder , required y autocomplete .
Una caja de texto que slo pueda contener nmeros (<input type="number">
), cuyos valores tienen que estar comprendidos entre 0 y 10.
Un campo de seleccin de ficheros (<input type="file"> ), al que aplicar el atributo
multiple .
http://www.arkaitzgarro.com/html5/capitulo-18.html[13/07/2015 12:03:48]
18.3 CAPTULO 4
18.3.1 EJERCICIO 3
Identificar las siguientes caractersticas de al menos 4 navegadores (2 de escritorio y 2
de dispositivos mviles):
Cules de los 12 nuevos tipos de input soporta el navegador.
Qu codecs de reproduccin de vdeo soporta cada navegador.
Qu sistema(s) de almacenamiento local soporta cada navegador.
18.3.2 EJERCICIO 4
Identificar si el navegador soporta el atributo placeholder . En caso de no soportar
dicha funcionalidad, cargar el polyfill correspondiente para aadir dicha funcionalidad al
navegador.
18.4 CAPTULO 5
18.4.1 EJERCICIO 5
A partir del siguiente HTML, realizar los siguientes pasos:
<ul>
<li class="user" data-name="Arkaitz Garro" data-city="Donostia"
data-lang="es" data-food="Txuleta">Arkaitz Garro</li>
<li class="user" data-name="John Doe" data-city="Boston"
data-lang="en" data-food="Bacon">John Doe</li>
<li class="user" data-name="Divya Resig" data-city="Tokyo"
data-lang="jp" data-food="Sushi" data-delete="true">Divya Resig</li>
</ul>
Obtener cada uno de los atributos data- de los elementos de la lista, y mostrarlos
por consola.
Modificar el idioma es por es_ES .
Eliminar los elementos de la lista cuyo atributo data-delete sea true .
18.5 CAPTULO 6
18.5.1 EJERCICIO 6
Crear un reproductor de vdeo que cumple las siguientes caractersticas:
Reproducir los vdeos independientemente del codec soportado por el navegador.
Incluir controles de reproduccin, pausa, parar, avanzar y retroceder 10 segundos,
inicio y fin.
18.6 CAPTULO 7
18.6.1 EJERCICIO 7
Dibujar sobre un elemento canvas, un stickman con un aspecto final similar al que se
muestra a continuacin. Seguir las siguiente indicaciones como ayuda:
El tamao inicial del canvas es de 200px del ancho y 300px de alto.
Utilizar un rectngulo negro para pintar todo el fondo del canvas.
Dibujar la cabeza con un arco completo, en las coordenadas ( 100,50 ), y un radio
de
30px .
18.7 CAPTULO 8
18.7.1 EJERCICIO 8
Implementad las siguientes funcionalidades utilizando SessionStorage y LocalStorage :
Crear una caja de texto, a modo de editor de contenidos, y utilizando
SessionStorage almacenar el contenido de la caja en cada pulsacin de tecla. Si la
pgina es recargada, el ltimo contenido almacenado debe mostrarse en la caja de
texto. Comprobad que cerrando la pestaa actual, o abriendo una nueva ventana,
los datos no se comparten.
Modificar el cdigo anterior para utilizar LocalStorage . Comprobad que en este
caso, aunque cierre la ventana o abra una nueva, los datos se mantienen. Aadir la
posibilidad de actualizar el resto de ventanas abiertas, cada vez que se modifique el
valor de la caja de texto en cualquiera de ellas.
18.7.2 EJERCICIO 9
Crear un objeto que encapsule una base de datos WebSQL, que nos permitar acceder a
una base de datos para aadir, modificar, eliminar y obtener registros. Dicha base de
datos va a almacenar tweets procedentes de Twitter, que tienen asociado el hashtag
#html5. Los requisitos son los siguientes:
Disponer de una tabla para almacenar los tweets. Los campos mnimos son:
identificador del tweet, texto, usuario, y fecha de publicacin.
Disponer de una tabla para almacenar los usuarios que publican los tweets. Esta
tabla debe estar relacionada con la anterior. Los campos mnimos son: identificador
del usuario, nombre e imagen.
Crear un mtodo addTweet que dado un objeto que corresponde con un tweet, lo
almacene en la base de datos. Almacenar el usuario en caso de que no exista, o
relacionarlo con el tweet si existe.
Crear un mtodo removeTweet que dado un identificador de tweet, lo elimine de la
base de datos. ste mtodo debe devolver el tweet eliminado.
Crear un mtodo updateTweet que dado un objeto que corresponde con un tweet,
actualice los datos correspondientes al tweet en la base de datos.
Crear un mtodo getTweets que dado un parmetro de fecha, me devuelva todos
los tweets posteriores a esa fecha. Cada tweet debe incluir sus datos completos y el
usuario que lo cre.
Obtener los ltimos 25 tweets que tienen como hashtag #html5 de la siguiente consulta
a Twitter: http://search.twitter.com/search.json? q=
%23html5&rpp=25&result_type="recent"
Consultad la API de Twitter para identificar el formato del resultado, nombres de campos,
etc.
18.7.3 EJERCICIO 10
Crear un objeto que encapsule una base de datos IndexedDB, que nos permitar acceder
a una base de datos para aadir, modificar, eliminar y obtener registros. Dicha base de
datos va a almacenar una sencilla lista de tareas pendientes. Los requisitos son los
siguientes:
Disponer de un almacn de tareas pendientes. Sus propiedades son: un identificador
nico que acta como ndice, el texto descriptivo, una propiedad que nos indique si
la tarea est completada o no y la fecha/hora de creacin.
Crear un mtodo addTask que dado un objeto que corresponde con una tarea, lo
almacene en la base de datos.
Crear un mtodo removeTask que dado un identificador de una tarea, lo elimine de
la base de datos. ste mtodo debe devolver la eliminada.
Crear un mtodo updateTask que dado un identificador de una tarea, actualice los
datos correspondientes a la tarea en la base de datos.
Crear un mtodo getTasks que dado un parmetro booelano completado, nos
devuelva las tareas que se encuentran completadas o no.
18.8 CAPTULO 9
18.8.1 EJERCICIO 11
Cread una pgina HTML que muestre la hora local de vuestro ordenador, y la hora del
servidor de www.google.es. Los clculos de hora local y obtencin de hora del servidor,
deben crearse en ficheros separados. El comportamiento es el siguiente:
Todos los ficheros necesarios para realizar el ejercicio deben ser cacheados, a
excepcin del javascript que solicita la peticin al servidor.
Las peticiones de hora al servidor www.google.es se realizan a travs de Ajax, en
intervalos de 1 segundo. Dichas peticiones no deben realizarse si no existe
conexin. En tal caso, se muestra un mensaje al usuario indicando que se ha
perdido la conexin.
Si se recarga la pgina, y no existe conexin, utilizar un fallback para la obtencin
de la hora del servidor, que muestre un mensaje al usuario indicando que se ha
perdido la conexin.
18.9 CAPTULO 10
18.9.1 EJERCICIO 12
Implementar un carrito de la compra que permita arrastrar los productos a la cesta, y
calcule el precio total de la compra. El proceso es el siguiente:
Al pasar con el ratn sobre una imagen, el puntero cambia de aspecto ( cursor:
move; ) y se permite arrastrar el contenido.
18.10
CAPTULO 11
18.10.1 EJERCICIO 13
Utilizando los servicios de geolocalizacin, realizar las siguientes tareas:
Solicitar las coordenadas actuales, y mostrar dichas coordenadas (y la precisin)
tanto en formato texto como un punto en el mapa.
Haciendo uso del entorno de desarrollo de Android (emulador y SDK) y la
herramienta DDMS, indicar al dispositivo una posicin GPS concreta.
Posteriormente, modificar la implementacin para solicitar continuamente la
posicin del dispositivo. En la herramienta DDMS, utilizar el fichero de rutas GPX
que se proporciona y mostrar cada nuevo punto en el mapa.
Descargar sitio web.
18.11 CAPTULO 12
18.11.1 EJERCICIO 14
Crear un Web worker que dado un nmero entero, calcule todos los nmeros primos
comprendidos entre 1 y dicho nmero.
Proporcionaremos a este Worker un nmero entero, y devolver un array con todos los
nmeros primos encontrados. Mostrar el listado de nmeros primos en el documento
principal.
18.12 CAPTULO 13
18.12.1 EJERCICIO 15
Implementar un servicio de chat, utilizando tecnologa Web Socket, a partir del cdigo
proporcionado, que se describe a continuacin.
Se dispone de un servidor de chat, basado en Node.js, al cual deben conectarse los
usuarios del chat. La direccin del servidor es ws://www.arkaitzgarro.com:1337 .
Se proporciona la interfaz bsica (HTML y JavaScript) para desarrollar la aplicacin.
Es necesario implementar la conexin con el servidor y el intercambio de mensajes,
as como la actualizacin de la interfaz.
El protocolo de mensajes es el siguiente:
El primer mensaje a enviar al servidor es el nick. Tomad el valor de la caja de
texto y enviarla al servidor como una cadena de texto.
Una vez estamos "registrados" en el servidor, ste puede comenzar a enviarnos
mensajes, tanto los existentes hasta el momento, como los nuevos que se
produzcan por otros usuarios. Estos mensajes (en formato JSON)
corresponden con un objeto JavaScript, cuya estructura se muestra a
continuacin.
Finalmente, para enviar los mensajes de texto del usuario, enviamos la cadena
servidor
NDICE DE CONTENIDOS
Ejercicios
Captulo 2
Captulo 3
Captulo 4
Captulo 5
Captulo 6
Captulo 7
Captulo 8
Captulo 9
Captulo 10
18.10 Captulo 11
18.11 Captulo 12
18.12 Captulo 13
Semntica | HTML5
HTML5
Anterior Siguiente
CAPTULO 2 SEMNTICA
Una de las novedades que hemos mencionado anteriormente son las etiquetas que se
han introducido en HTML5. Existen ms de 30 nuevas etiquetas semnticas que pueden
ser utilizadas en nuestras pginas estticas. Estas nuevas etiquetas se podran clasificar
en dos grupos:
Etiquetas que extienden a las actuales, como <video> , <audio> o <canvas> , y
que adems aaden nuevas funcionalidades a los documentos HTML, que
podemos controlar desde JavaScript y
etiquetas que componen la web semntica, es decir, que no proponen nuevas
funcionalidades pero sirven para estructurar sitios web, y aadir un significado
concreto, ms all de las etiquetas generales como <div> .
En este captulo, veremos como transformar nuestra estructura actual de marcado
basada en <div> , a una estructura que utiliza las nuevas etiquetas estructurales
como
<nav> , <header> , <footer> , <aside> , o <article> .
2.1.1 DOCTYPE
El estndar XHTML deriva de XML, por lo que comparte con l muchas de sus normas y
sintaxis. Uno de los conceptos fundamentales de XML es la utilizacin del DTD o
Document Type Definition ("Definicin del Tipo de Documento"). El estndar XHTML
define el DTD que deben seguir las pginas y documentos XHTML. En este documento se
definen las etiquetas que se pueden utilizar, los atributos de cada etiqueta y el tipo de
valores que puede tener cada atributo.
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE html>
En este caso ocurre lo mismo con el atributo xml:lang , es una herencia de XHTML
que podemos eliminar, quedando finalmente la etiqueta de la siguiente manera:
<html lang="en">
charset="utf-8"
content="text/html; charset=UTF-8">
2.1.3.2 LINKS
Dentro del elemento head , las etiquetas <link> son una manera de acceder o declarar
contenido externo al documento actual, que puede cumplir distintos objetivos:
Es una hoja de estilo contiene las reglas CSS que su navegador debe aplicar al
presente documento.
Es un feed que contiene el mismo contenido que esta pgina, pero en un formato
estndar (RSS).
Es una traduccin de esta pgina en otro idioma.
Es el mismo contenido que esta pgina, pero en formato PDF.
Es el prximo captulo de un libro en lnea de la cual esta pgina es tambin una
parte.
En HTML5, se separan estas relaciones de enlace en dos categoras:
Enlaces a recursos externos que se van a utilizar para mejorar el documento actual,
y enlaces de hipervnculos que son enlaces a otros documentos.
El tipo de relacin ms utilizado (literalmente) es el siguiente:
<link rel="stylesheet" href="style-original.css" type="text/css"
/>
Esta relacin es utilizada para indicar el archivo donde se almacenan las reglas CSS que
se desean aplicar al documento. Una pequea optimizacin que se puede hacer en
HTML5 es eliminar el atributo type . Slo hay un lenguaje de estilo para la web, CSS,
as que ese es el valor predeterminado para el atributo type :
<link rel="stylesheet" href="style-original.css"
/>
cualquier sistema podr procesar la pgina y saber cmo est estructurada. Veamos
algunas de estas etiquetas que introduce HTML5 en este sentido.
<section></section> : se utiliza para representar una seccin "general" dentro
a otras partes dentro de la pgina. No todos los grupos de enlaces en una pgina
necesita estar en un elemento nav , slo las secciones que constan de bloques de
navegacin principales son apropiados para el elemento de navegacin.
<footer></footer> : representa el pie de una seccin, con informacin acerca de la
pgina/seccin que poco tiene que ver con el contenido de la pgina, como el autor,
el copyright o el ao.
<hgroup></hgroup> : representa el encabezado de una seccin. El elemento se
utiliza para agrupar un conjunto de elementos h1-h6 cuando el ttulo tiene varios
niveles, tales como subttulos o ttulos alternativos.
<time> : representa o bien una hora (en formato de 24 horas), o una fecha
</div>
<div class="articles">
<div class="article">
<p class="post-date">October 22, 2009</p>
<h2>
<a href="#" title="link to this post">Travel day</a>
</h2>
<div class="content">
Content goes here...
</div>
<div class="comments">
<p><a href="#">3 comments</a></p>
</div>
</div>
</div>
<div class="aside">
<div class="related"></div>
<div class="related"></div>
<div class="related"></div>
</div>
<div id="footer">
<p>§</p>
<p>© 2013–9 <a href="#">Arkaitz Garro</a></p>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<header>
<a href="/"><img src=logo.png alt="home"></a>
<hgroup>
<h1>Title</h1>
<h2 class="tagline">
A lot of effort went into making this effortless.
</h2>
</hgroup>
</header>
<nav>
<ul>
<li><a href="#">home</a></li>
<li><a href="#">blog</a></li>
<li><a href="#">gallery</a></li>
<li><a href="#">about</a></li>
</ul>
</nav>
<section class="articles">
<article>
<time datetime="2009-10-22">October 22, 2009</time>
<h2>
<a href="#" title="link to this post">Travel day</a>
</h2>
<div class="content">
Content goes here...
</div>
<section class="comments">
<p><a href="#">3 comments</a></p>
</section>
</article>
</section>
<aside>
<div class="related"></div>
<div class="related"></div>
<div class="related"></div>
</aside>
<footer>
<p>§</p>
<p>© 2013–9 <a href="#">Arkaitz Garro</a></p>
</footer>
</body>
</html>
Partiendo de la anterior estructura, parece evidente las nuevas etiquetas que debemos
utilizar. Esto no siempre es as, y cuando estructuramos contenidos de mucho mayor
alcance, lo normal es que nos surjan dudas. Un sencillo algoritmo que nos puede ayudar
alt="home"></a>
Tambin es muy comn que los sitios web muestren un lema o subttulo bajo el ttulo
Semntica | HTML5
principal. Para dar mayor importancia a este subttulo, y relacionarlo de alguna manera
con el ttulo principal de la web, es posible agrupar los dos titulares bajo un elemento
<hgroup> .
<header>
<a href="/"><img src=logo.png alt="home"></a>
<hgroup>
<h1>Title</h1>
<h2 class="tagline">
A lot of effort went into making this effortless.
</h2>
</hgroup>
</header>
2.4.2<NAV>
Segn la especificacin, un elemento <nav> representa lo siguiente:
El elemento <nav> representa una seccin de una pgina que enlaza con otras
pginas o partes de la misma pgina: una seccin con enlaces de navegacin.
El elemento <nav> ha sido diseado para identificar la navegacin de un sitio web. La
navegacin se define como un conjunto de enlaces que hacen referencia a las secciones
de una pgina o un sitio, pero no todos los enlaces son candidatos de pertenecer a un
elemento <nav> : una lista de enlaces a patrocinadores o los resultados de una
bsqueda, no forman parte de la navegacin principal, sino que corresponden con el
contenido de la pgina.
Como ocurre con los elementos <header> , <footer> y el resto de nuevas etiquetas, no
estamos obligados a utilizar un nico elemento <nav> en toda la pgina. Es posible que
tengamos una navegacin principal en la cabecera de la pgina, una tabla de contenidos
o enlaces en el pie de la pgina, que apuntan a contenidos secundarios. Todos ellos son
candidatos a pertenecer a un elemento <nav> .
<nav>
<ul>
<li><a href="#">home</a></li>
<li><a href="#">blog</a></li>
<li><a href="#">gallery</a></li>
<li><a href="#">about</a></li>
</ul>
</nav>
2.4.3<FOOTER>
Segn la especificacin, un elemento <footer> representa lo siguiente:
2.4.4<ARTICLE>
Segn la especificacin, un elemento <article> representa lo siguiente:
Este elemento representa un contenido completo, auto-contenido en un documento,
pgina, aplicacin o sitio web, que es, en principio, independiente de ser distribuido
y reutilizado, por ejemplo en un RSS. Puede ser un post de un foro, un artculo de
un peridico o revista, una entrada de un blog, un comentario de un usuario, un
widget o cualquier otro elemento independiente.
Cuando los artculos estn anidados, los artculos interiores representan contenido
que en principio est relacionado con el artculo que los contiene. Por ejemplo, una
entrada de un blog puede aceptar comentarios de usuarios, que estn incluidos
dentro del contenido principal y relacionados con el mismo.
Por lo tanto, la etiqueta <article> se utiliza para encapsular contenido, que tiene
significado en s mismo, y que puede ser distribuido y reutilizado en otros formatos de
datos. No nos referimos nicamente a contenidos clsicos de texto, sino que incluso un
contenido multimedia con su transcripcin, un mapa o email pueden ser totalmente
vlidos para ser incluidos en una etiqueta <article> .
<section>
<h1>Comments</h1>
<article id="c1">
<footer>
<p>Posted by: <span>George Washington</span></p>
<p><time datetime="2009-10-10">15 minutes ago</time></p>
</footer>
<p>Yeah! Especially when talking about your lobbyist friends!</p>
</article>
<article id="c2">
<footer>
<p>Posted by: <span itemprop="name">George Hammond</span></p>
<p><time datetime="2009-10-10">5 minutes ago</time></p>
</footer>
<p>Hey, you have the same first name as me.</p>
</article>
</section>
2.4.5<SECTION>
A diferencia del elemento <article> , este elemento es utilizado para dividir el
documento (o artculos) en diferentes reas, o como su propio nombre indica, en
secciones. Segn la especificacin, un elemento <section> representa lo siguiente:
Representa una seccin genrica de un documento o aplicacin. Una seccin, en
este contexto, es un grupo temtico de contenido, que generalmente incluye una
cabecera.
Consideremos el siguiente marcado vlido en HTML 4:
<h1>Rules for Munchkins</h1>
<h2>Yellow Brick Road</h2>
<p>It is vital that Dorothy follows itso no selling
bricks as "souvenirs"</p>
<h2>Fan Club uniforms</h2>
<p>All Munchkins are obliged to wear their "Im a friend
of Dorothy!" t-shirt when representing the club</p>
<p><strong>Vital caveat about the information above:
does not apply on the first Thursday of the month.</strong></p>
En este caso, y desde un punto de vista semntico, es complicado deducir si el texto Vital
caveat about the information above: does not apply on the first Thursday of the month.
pertenece al contenido completo o est relacionado con la seccin Fan Club uniforms.
Gracias a la etiqueta <section> , es muy sencillo separar e identificar a qu
seccin pertenece cada contenido:
<article>
<h1>Rules for Munchkins</h1>
<section>
<h2>Yellow Brick Road</h2>
<p>It is vital that Dorothy follows itso no selling
bricks as "souvenirs"</p>
</section>
<section>
<h2>Fan Club uniforms</h2>
<p>All Munchkins are obliged to wear their "Im a friend
of Dorothy!" t-shirt when representing the club</p>
</section>
<p><strong>Vital caveat about the information above:
does not apply on the first Thursday of the month.</strong></p>
</article>
<article>
<h1>Rules for Munchkins</h1>
<section>
<h2>Yellow Brick Road</h2>
<p>It is vital that Dorothy follows itso no selling
bricks as "souvenirs"</p>
</section>
<section>
<h2>Fan Club uniforms</h2>
<p>All Munchkins are obliged to wear their "Im a friend
of Dorothy!" t-shirt when representing the club</p>
<p><strong>Vital caveat about the information above:
does not apply on the first Thursday of the month.</strong></p>
</section>
</article>
Como podemos observar en los dos ejemplos anteriores, es muy sencillo agrupar
contenido que pertenece a una misma seccin, permitiendo incluirlo dentro de un
contexto semntico.
Otra de las posibilidades que nos ofrece esta etiqueta, es la de dividir nuestro documento
en secciones, que incluyen contenido de temticas diferentes entre s. Si adems
queremos separar estos contenidos visualmente en dos columnas, lo lgico sera utilizar
las tradicionales etiquetas <div> para agrupar los artculos segn su temtica, y
posteriormente aplicar estilos CSS o JavaScript para presentarlos en forma de pestaas.
En este caso, la etiqueta <div> no nos aporta ningn significado semntico, tan slo
estructural. La etiqueta <section> es la encargada de aadir semntica en estos casos:
<section>
<h1>Articles about llamas</h1>
<article>
<h2>The daily llama: Buddhism and South American
<p>blah blah</p>
</article>
<article>
<h2>Shh! Do not alarm a llama</h2>
<p>blah blah</p>
</article>
</section>
<section>
<h1>Articles about root vegetables</h1>
<article>
<h2>Carrots: the orange miracle</h2>
<p>blah blah</p>
</article>
camelids</h2>
<article>
<h2>Eat more Swedes (the vegetables, not the
<p>blah blah</p>
</article>
</section>
people)</h2>
2.4.6<ASIDE>
Segn la especificacin, un elemento <aside> representa lo siguiente:
Una seccin de una pgina que consiste en contenido tangencialmente relacionado
con el contenido alrededor del elemento, y puede considerarse separado de este
contenido. Estas secciones son normalmente representadas como elementos
laterales en medios impresos. Este elemento puede utilizarse contener citas,
anuncios, grupos de elementos de navegacin y cualquier otro contenido separado
del contenido principal de la pagina.
Dentro de un artculo, por ejemplo, puede ser utilizado para mostrar contenido
relacionado como citas u otros artculos relacionados.
2.4.7<FIGURE>
Segn la especificacin, un elemento <figure> representa lo siguiente:
The figure element represents some flow content, optionally with a caption, that is
self-contained and is typically referenced as a single unit from the main flow of
the document.
The element can be used to annotate illustrations, diagrams, photos, code listings,
etc. This includes, but is not restricted to, content referred to from the main part
of the document, but that could, without affecting the flow of the document, be
moved away from that primary content, e.g. to the side of the page, to dedicated
pages, or to an appendix.
Hasta ahora, no haba una manera correcta de poder aadir un subttulo o una leyenda a
un contenido concreto, como explicar una figura o atribuir una imagen a un fotgrafo.
Gracias a la etiqueta <figure> podemos contener una imagen (o un vdeo, ilustracin o
bloque de cdigo) en un elemento y relacionarlo con un contenido concreto:
<figure>
<img src="welcome.jpg" alt="Alternative text">
<figcaption>
Bruce and Remy welcome questions
<small>Photo © Bruces mum</small>
</figcaption>
</figure>
En conveniente recordar que el atributo alt indica el texto a mostrar cuando la imagen
no est disponible, y no est pensada para contener una descripcin de la imagen, y
mucho menos para duplicar lo ya indicado en la etiqueta <figcaption> .
Ejercicio 1
Ver enunciado
2.5.1 ACCESSKEY
El atributo accesskey permite a los desarrolladores especificar un atajo de teclado que
permite activar un elemento a asignarle el foco. Este atributo ya exista en HTML 4,
aunque ha sido utilizado en muy pocas ocasiones. Como HTML5 est pensado para
aplicaciones, y algunos usuarios siguen prefiriendo los atajos de teclado, este atributo no
ha sido eliminado, y ahora est disponible para cualquier elemento.
Para evitar conflictos con otros atajos de teclado, o con los propios del navegador, ahora
esta etiqueta permite asignar alternativas en este atributo. Un ejemplo incluido en la
especificacin:
<input type="search" name="q" accesskey="s
0">
Esto quiere decir que este elemento es accesible a travs de dos atajos de teclado, a
travs de la tecla s o a travs de la tecla 0 (en ese orden).
2.5.2 CONTENTEDITABLE
Inventado por Microsoft, e implementado por el resto de los navegadores, la etiqueta
contenteditable es ahora parte de la especificacin oficial.
Finalmente, el contenido que ha sido seleccionado por el usuario, puede ser objeto de
modificaciones, como hemos comentado antes. A travs del comando
element.execCommand() es posible indicar el tipo de modificacin (poner en negrita,
copiar, cambiar la fuente...), siempre que el documento se haya indicado como editable.
document.designMode = 'on';
2.5.4 DRAGGABLE
Este atributo indica que el elemento indicado puede ser arrastable. Lo veremos en el
captulo correspondiente.
NDICE DE CONTENIDOS
Semntica
Cabecera del documento
Nuevas etiquetas semnticas
Estructura de un documento HTML5
Uso de las nuevas etiquetas semnticas
Atributos globales