Rob Crowther | Joe Lennon | Ash Blue | Greg Wanish Novatec Original English language edition published by Manning Publications Co., Copyright © 2013 by Manning Publications Co.. Portuguese-language edition for Brazil copyright © 2014 by Novatec Editora. All rights reserved. Edição original em inglês publicada pela Manning Publications Co., Copyright © 20103 pela Manning Publications Co.. Edição em português para o Brasil copyright © 2014 pela Novatec Editora. Todos os direitos reservados. © Novatec Editora Ltda. 2014. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates Tradução: Aldir José Coelho Corrêa Revisão gramatical: Marta Almeida de Sá Editoração eletrônica: Carolina Kuwabata ISBN: 978-85-7522-399-4 OG20141110 Histórico de impressões: Novembro/2014 Primeira edição Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 – São Paulo, SP – Brasil Tel.: +55 11 2959-6529 Email: [email protected] Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec capítulo 1 HTML5: de documentos a aplicativos Este capítulo aborda • Os aspectos básicos do uso de HTML5 • Novos recursos de mídia e marcação semântica • Novas APIs JavaScript • Especificações web relacionadas O HTML5 é um dos tópicos mais falados do desenvolvimento web, e por uma boa razão. Além de ser a última versão da linguagem de marcação da web, também define um padrão totalmente novo para o desenvolvimento de aplicativos web. Versões anteriores do HTML (e de seu rígido parente com base em XML, o XHTML) enfocavam principalmente o conceito de HTML como uma linguagem de marcação para documentos. O HTML5 é a primeira versão a adotar a web como uma plataforma para o desenvolvimento de aplicativos web. A nova versão define uma série de novos elementos que você pode usar para desenvolver aplicativos de Internet rica assim como um conjunto de APIs JavaScript padrão para os navegadores implementarem nativamente. Um bom exemplo dos novos elementos do HTML5 é <video>, que fornece um meio de reproduzirmos conteúdo de vídeo no navegador sem necessidade de um plugin adicional. O HTML5 também fornece a Media Element Interface que nos permite controlar a reprodução de vídeo com JavaScript. Podemos criar jogos, construir aplicativos móveis e muito mais. 25 26 HTML5 em ação Neste capítulo, você aprenderá • Os excelentes recursos novos introduzidos no HTML5 e como usá-los imediatamente em seus aplicativos web. • Como fornecer alternativas e soluções provisórias para usuários com navegadores mais antigos ou incompatíveis. • Como usar as funções e os microdados do ARIA (Accessible Rich Internet Applications) para melhorar a semântica de suas páginas HTML. • O amplo conjunto de APIs JavaScript disponível no próprio HTML5, assim como várias especificações de APIs intimamente relacionadas que você pode usar em seus aplicativos. No fim do capítulo, você terá uma ideia abrangente do que o HTML5 tem a oferecer e poderá usá-lo em seus próprios aplicativos web. Documentos (HTML4) versus aplicativos (HTML5) Inicialmente a web só tinha documentos. Os formulários foram adicionados pelo navegador Mosaic em 1993, mas só havia entrada de dados; toda a lógica do aplicativo permanecia no servidor. A introdução de JavaScript em 1995 tornou teoricamente possível a existência de aplicativos com base no navegador, mas a ideia só foi realmente adotada após a chegada do objeto XMLHTTPRequest em 1999. A última grande versão da especificação HTML, a de número 4.01, só se tornou uma recomendação em 1999. Logo, não é de surpreender que a especificação 4.01 ainda se dedicasse quase totalmente ao uso de marcação para descrever documentos, o que normalmente agora chamamos de marcação semântica. Levou tempo para surgir a nova versão do HTML, e enquanto isso a web mudou muito. Como você verá nas seções a seguir, o HTML5 apresenta melhorias na área de marcação semântica. No entanto a maioria das diferenças e melhorias do HTML5 em relação ao HTML4 está nos recursos para a construção de aplicativos com base em navegador com o uso de JavaScript. Por isso, e porque este livro é dedicado aos novos recursos do HTML5, passamos muito mais tempo lidando com JavaScript do que com marcação. É claro que vamos abordar alguma marcação, mas, como você verá, o JavaScript é a grande estrela do HTML5. Para começar, mostraremos como você pode se atualizar com a criação de um documento HTML5. Capítulo 1 ■ HTML5: de documentos a aplicativos 27 1.1 Explorando a marcação: um passeio relâmpago pelo HTML5 A melhor maneira de aprender o que há de novo no HTML5 é passar logo à utilização. O objetivo desta seção é não só fazer uma demonstração de alto nível dos novos recursos, mas também lhe dar conhecimento suficiente para que você possa atualizar seus aplicativos para usarem convenções HTML5 sem prejudicar usuários que não tenham os navegadores mais recentes e melhores. Nesta seção, você aprenderá • Como criar uma estrutura de documento HTML5 básica. • Como usar os novos elementos de semântica para estruturar uma página. • Como lidar com versões mais antigas do Internet Explorer que não reconheçam os novos elementos. • Os novos recursos de formulários que podem ser implementados imediatamente em HTML5. • Como usar os novos elementos de UI, como as barras de progresso e as seções colapsáveis. Começaremos examinando a estrutura básica de um documento HTML5. Se não estiver interessado no básico, você pode ler rapidamente até chegar à seção 1.2, que vai além da marcação semântica e entra no ambiente HTML5. 1.1.1 Criando a estrutura básica de um documento HTML5 Os documentos HTML5 são estruturados da mesma forma que nas versões anteriores do HTML: colocamos uma declaração <!DOCTYPE> no topo do documento e abrimos e fechamos o documento HTML com as tags <html> e </html> correspondentes. Entre essas tags, há uma seção <head>, onde inserimos informações <meta> e outros itens não referentes ao conteúdo, como folhas de estilos, e uma seção <body>, onde o conteúdo da página deve entrar. Se você já criou páginas ou aplicativos HTML, não há novidades aqui, mas é preciso conhecer algumas diferenças sutis, que abordaremos nesta seção: • A sintaxe da declaração DOCTYPE em HTML5. • Como usar o elemento de abertura <html>. • Como usar as versões mais curtas dos diversos elementos na seção <head>. Vejamos mais detalhadamente essas diferenças examinando hello.html, o equivalente HTML5 a um aplicativo “Hello, World!”, mostrado na listagem a seguir. 28 u HTML5 em ação Listagem 1.1 hello.html – A estrutura básica de um documento HTML5 <!DOCTYPE html> ❶ <html lang="en"> ❷ <head> <meta charset="utf-8"> ❸ <title>Hello, HTML5!</title> <link rel="stylesheet" href="style.css"> ❹ <script src="app.js"></script> ❺ </head> <body> <h1>Hello, HTML5!</h1> </body> </html> ❶ A declaração DOCTYPE em HTML5 é curta – não precisamos lembrar de DTDs e URLs ridiculamente longos. Ela força o uso do modo-padrão em todos os navegadores modernos, logo, você pode começar a usá-la em seus aplicativos imediatamente, sem consequências negativas. ❷ O atributo xmlns do XHTML não é válido na serialização de HTML do HTML5, logo, não use-o (consulte a caixa de observação “HTML e XML”). Você deve sempre usar o atributo lang para especificar o idioma de seus documentos. ❸ Agora o elemento <meta> dá suporte a um atributo charset, permitindo o uso de uma sintaxe mais fácil de lembrar do que a antiga combinação de atributos http-equiv e content para a definição do conjunto de caracteres da página (nesse caso, estamos usando o Unicode de 8 bits). É bom ressaltar que, na serialização de XML do HTML5, essa tag precisa ter autofechamento (como em <meta charset="utf-8"/>). Consulte a caixa de observação “HTML e XML” para ver mais detalhes. ❹ Todos os navegadores modernos assumem que o elemento <link> de uma folha de estilos é de tipo text/css por padrão, logo, você pode omitir esse atributo seguramente em seus documentos HTML5. ❺ Os navegadores assumem que os elementos <script> sejam de tipo text/javascript, logo, você não precisa especificar o atributo a menos que não o esteja usando para código JavaScript. Essa é uma estrutura de página básica. A seguir, mostraremos como você deve usar os novos elementos semânticos para construir uma página – nesse caso, o exemplo de uma página de postagem de um blog. Capítulo 1 ■ HTML5: de documentos a aplicativos 29 HTML e XML Versões anteriores do que consideramos como especificação HTML eram ou para HTML ou para XHTML. A marcação HTML foi projetada para ser abrangente, enquanto o XHTML foi construído a partir de XML e de um rigoroso modelo de análise. O XHTML exigia que todos os elementos tivessem tags de fechamento (<br/> em vez de <br>, por exemplo) e todas as tags e os atributos estivessem em letras minúsculas. Um único erro fazia a página inteira falhar. Devido a essa manipulação de erros draconiana, a maioria dos sites nunca implementou apropriadamente o XHTML. Eles tendiam a usar formulários na sintaxe XHTML, mas enviar páginas com um tipo de conteúdo text/html, causando uma análise HTML na marcação XML. O HTML5 unifica tudo em uma única especificação, permitindo serializações tanto de HTML quanto de XML; isto é, a especificação fornece um vocabulário que pode ser expresso em HTML ou XML. A serialização do XHTML deve ser enviada com um tipo de conteúdo XML, como application/xml+xhtml. Ela também obedece às regras de análise XML em vez de HTML, requerendo uma declaração xlmns, tags de fechamento e assim por diante. No download de códigos há duas versões adicionais da listagem 1.1 mostrando a mesma marcação em código XHTML válido e inválido: hello-invalid.xhtml, que usa sintaxe HTML em um documento XML e hello-valid. xhtml, que corrige a marcação para um XML válido. 1.1.2 Usando os novos elementos semânticos Se você leu sobre HTML5 antes de comprar este livro, deve ter ouvido muita coisa sobre os novos elementos semânticos. Eles são importantes, principalmente se você quiser que mecanismos de busca e tecnologias assistenciais como os leitores de tela entendam melhor suas páginas, mas não são mais difíceis de usar do que os elementos que você conhece e aprecia no HTML4. Não se empolgue muito com esse novo conjunto de tags. Se você espera que esses novos elementos façam alguma mágica em termos de sua aparência na página, vai se decepcionar. O uso dos novos elementos em uma página é equivalente em funcionalidade ao uso de uma série de elementos <div>; eles se comportam como elementos de bloco por padrão e podem ser estilizados como necessário com o uso de CSS. Sua importância vem do significado semântico padrão que eles têm. Considere, por exemplo, um post de blog típico, em que a página web contém várias seções. Primeiro, você teria o cabeçalho e a navegação do site, talvez alguma navegação por barra lateral, uma área de conteúdo principal, uma área de rodapé com links de navegação adicionais e talvez alguns links de direitos autorais e conteúdo legal. A listagem a seguir demonstra como o post desse blog poderia ter sido marcado em HTML4 ou XHTML. 30 u HTML5 em ação Listagem 1.2 html4-blog.html – Marcação HTML4 para o post de um blog <div class="header"> <h1>My Site Name</h1> <h2>My Site Slogan</h2> <div class="nav"> <ul><!-- A navegação principal entra aqui --></ul> </div> </div> <div class="sidebar"> <h3>Links Heading</h3> <ul><!-- Links de barra lateral --></ul> </div> <div class="main"> <h4>Blog Post Title</h4> <div class="meta"> Published by Joe on 01 May 2011 @ 12:30pm </div> <div class="post"> <!-- Post do blog --> </div> </div> <div class="footer"> <ul><!-- Links de rodapé --></ul> <!-- Informações de direitos autorais --> </div> O código anterior não está errado. É perfeitamente válido usá-lo em HTML5 e é claro que você pode continuar usando elementos <div> com nomes de classe semânticos se quiser. Mas, do ponto de vista semântico, essa abordagem traz dois problemas: • Usando o padrão antigo, acabamos separando áreas do post usando classes nomeadas. Isso é correto, mas a convenção de nomeação de classes é definida pelo autor. O que para nós é “header” para você pode ser “heading”; chamamos a seção principal de “main”, mas você poderia chamá-la de “body” ou “article”. • Algumas pessoas podem preferir usar IDs em vez de classes. Elas poderiam usar id="header" enquanto outras usariam class="header". Capítulo 1 ■ HTML5: de documentos a aplicativos 31 Resumindo, um mecanismo de busca ou outro aplicativo controlado por computador não tem como determinar de maneira confiável o que cada seção representa. É aí que os novos elementos semânticos entram em cena. Em vez de usar classes e IDs para seções como cabeçalhos, navegação e rodapés, agora você pode usar vários elementos HTML diferentes, mostrados na listagem a seguir. Adicione esse código entre as tags <body> do arquivo hello.html. u Listagem 1.3 html5-blog.html – Marcação HTML5 para o post de um blog <header> ❶ <hgroup> ❷ <h1>My Site Name</h1> ❸ <h2>My Site Slogan</h2> </hgroup> <nav> <ul><!-- A navegação principal entra aqui --></ul> ❹ </nav> </header> <nav> <h1>Links Heading</h1> <ul><!-- Links de barra lateral --></ul> </nav> <section> ❺ <article> ❻ <header> <h1>Blog Post Title</h1> <div class="meta"> Published by Joe on <time datetime="2012-05-01T12:30+00:00"> ❼ 01 May 2012 @ 12:30pm ❽ </time> ❼ </div> </header> <section> <!-- Post do blog --> </section> </article> </section> 32 HTML5 em ação <footer> ❾ <ul><!-- Links de rodapé --></ul> <!-- Informações de direitos autorais --> </footer> ❶ Elemento reutilizável para o título e outros detalhes importantes (nome do post, permalink, metainformações). ❷ Cabeçalhos numerados de grupo (<h1> a <h6>). ❸ Você pode ter um <h1> em <hgroup> e outro <h1> em <article>. A estrutura de cabeçalho não funciona da mesma forma que no HTML4. ❹ Seção de links dentro da página. A especificação diz que só os “blocos de navegação principais” devem usar o elemento <nav>, como a barra de navegação principal ou o sumário. ❺ Define um bloco de conteúdo, como a seção principal de um artigo de wiki ou um formulário importante. As seções podem ter seus próprios cabeçalhos, navegação e rodapés. ❻ Marca um componente publicável autônomo, que pode ser redistribuído independentemente, como no caso de entradas RSS, posts de blogs, comentários, posts de fóruns, novas entradas e assim por diante. Elementos <article> também permitem cabeçalhos, navegação e elementos de rodapé. ❼É difícil analisar datas, devido às diversas maneiras como elas podem ser apresentadas. <time> permite que você apresente o formato data/hora de sua preferência para o usuário junto a um valor que os computadores possam entender facilmente no atributo datetime. ❽ Se o atributo datetime for usado, o conteúdo do elemento <time> poderá ter o texto que você quiser (por exemplo, "next Tuesday"), mas se ele for omitido, o conteúdo terá de ser um formato de data e/ou hora válido (consulte o apêndice B para ver exemplos). ❾ Geralmente esse elemento aparece na parte inferior de uma página ou seção, usado para coisas como posts ou links relacionados, informações de direitos autorais e metadados. dois outros importantes elementos html: <aside> e <mark> Não queremos prosseguir sem mencionar dois outros importantes elementos HTML que você usará muito: <aside> e <mark>. Você pode usar o elemento <aside> para estabelecer uma seção da página que seja separada da área de conteúdo em que é definida. Capítulo 1 ■ HTML5: de documentos a aplicativos 33 Em um livro ou uma revista, a seção pode ser representada como uma barra lateral contendo informações sobre o mesmo tópico que não se enquadrem muito bem no artigo principal. Por exemplo, se você tivesse um blog, poderia haver anúncios ao lado dos posts – eles poderiam ser inseridos em um elemento <aside>. Em um aplicativo web, você pode usar <aside> para uma janela pop-up ou flutuante que apareça sobre a parte principal do aplicativo. O elemento <mark> pode ser usado para representar uma parte do texto de seu documento que deva ser marcada ou realçada. Um uso comum para esse recurso seria no realce dos termos de uma pesquisa dentro do documento. Com os novos elementos semânticos, além de a marcação ficar com uma aparência mais limpa, os spiders dos mecanismos de busca e as tecnologias assistenciais também entenderão as páginas mais facilmente. Falar de tecnologias assistenciais nos leva a nosso próximo tópico importante: os papéis do ARIA. 1.1.3 Melhorando a acessibilidade usando papéis do ARIA Ao construir aplicativos web, você deve assegurar que seu aplicativo possa ser acessado por todos os usuários, inclusive os que precisem de tecnologias assistenciais como os leitores de tela. Assegurar que seus documentos sejam acessíveis requer um cuidado especial no que diz respeito ao significado semântico da marcação. Usar uma marcação HTML simples torna essa tarefa relativamente fácil, e os novos elementos HTML5 melhoram ainda mais a semântica. Mas quando você estiver criando aplicativos web, será muito mais difícil se adequar à tecnologia assistencial. A crescente quantidade de código JavaScript usada na modificação dinâmica de páginas web nos aplicativos web modernos torna muito mais difícil distribuir acessibilidade somente através de uma boa marcação. É aí que entram em cena os padrões da Web Accessibility Initiative (WAI) e do ARIA. A especificação WAI-ARIA visa melhorar os aplicativos web expandindo as informações de acessibilidade fornecidas pelo autor de um documento HTML. Os papéis, relacionamentos, estados e as propriedades do ARIA permitem que você defina exatamente como seu aplicativo web funciona de uma maneira que uma tecnologia assistencial como um leitor de tela possa entender. Se, por exemplo, você construir uma lista suspensa a partir de uma entrada de texto e uma lista não ordenada, poderá aplicar o papel combobox do ARIA ao elemento de entrada para que ele seja renderizado apropriadamente no dispositivo do usuário. A listagem a seguir mostra um exemplo desse estilo de marcação tirado diretamente da especificação WAI-ARIA 1.0. 34 u HTML5 em ação Listagem 1.4 Exemplo do papel combobox do ARIA tirado de www.w3.org/TR/wai-aria/roles#combobox <input type="text" aria-label="Tag" role="combobox" ❶ aria-autocomplete="list" ❷ aria-owns="owned_listbox"> ❸ <ul role="listbox" ❹ id="owned_listbox"> ❺ <li role="option">Zebra</li> <li role="option">Zoom</li> </ul> ❶ O atributo role permite que você declare que tipo de widget está manipulando. ❷ O ARIA tem vários tipos de autoconclusão; nesse caso, uma lista fornecerá os valores das opções. ❸ O ❹ elemento que fornece as opções de autoconclusão terá essa ID. A lista não ordenada tem o papel listbox, para complementar o tipo fornecido na anotação do ARIA. ❺ Essa ID corresponde à fornecida anteriormente. A especificação HTML5 declara explicitamente que podemos usar os atributos role e aria-* do ARIA em elementos HTML como descrito na especificação do ARIA; isso não era permitido em HTML4. O HTML5 também define um conjunto de papéis padrão do ARIA aplicáveis a certos elementos HTML. Por exemplo, é sugerido que o elemento <input> de uma caixa de seleção terá um papel checkbox do ARIA, e você não deve usar explicitamente atributos role ou aria-* diferentes dos sugeridos nesse caso. Você também encontrará elementos HTML onde a semântica nativa pode ser modificada para que eles se comportem diferentemente. Por exemplo, você poderia criar um elemento <a> que se comportasse como um botão e usá-lo para enviar um formulário após executar alguma validação. A especificação HTML5 define uma lista de semânticas válidas para esses elementos. Quando você usar o elemento <a> para criar um hiperlink, ele assumirá o papel link por padrão, e se for modificado, seu papel só poderá ser alterado para um dos descritos a seguir: button, checkbox, menuitem, menuitemcheckbox, menuitemradio, tab ou treeitem. Para ver uma lista completa das semânticas-padrão sugeridas do ARIA, e as restrições a como você pode modificar a semântica de certos elementos, consulte a seção do WAI-ARIA na especificação HTML5 em http://mng.bz/6hb2. Capítulo 1 ■ HTML5: de documentos a aplicativos 35 1.1.4 Permitindo o suporte no Internet Explorer versões 6 a 8 Um assunto que pode lhe preocupar, e com razão, no que diz respeito aos elementos HTML5 é a compatibilidade com navegadores mais antigos. Cada nova versão do HTML traz com ela novos elementos que podemos usar nos documentos. O HTML5 não é diferente. A maioria dos navegadores modernos é mais do que capaz de renderizar esses elementos, até mesmo em versões que não lhes deem suporte especificamente. A maneira como a maioria dos navegadores manipula elementos não reconhecidos é renderizando-os como simples elementos <span> inline. Só é preciso configurá-los para exibir block with CSS. Infelizmente, o Internet Explorer (IE) é uma exceção. Em versões anteriores ao IE9, o navegador renderizava elementos não reconhecidos, mas não permitia que fossem estilizados com o uso de Folhas de Estilo em Cascata (CSS). Como você pode imaginar, isso torna difícil começar a usar os novos elementos HTML5 em um aplicativo de produção, porque os usuários ainda podem estar usando o IE6, 7 ou 8. renderizando os novos elementos apropriadamente no ie Ainda bem que esse problema tem uma solução simples. Se quiser usar o elemento <header> em sua página e precisar aplicar estilos CSS, inclua o fragmento a seguir na seção <head> da página. Isso forçará o IE a aplicar as regras CSS à tag, mesmo se a versão do IE usada não der suporte a um elemento específico nativamente: <!--[if lte IE 8]> <script>document.createElement("header");</script> <![endif]--> Você terá de executar um equivalente dessa instrução JavaScript para cada elemento específico do HTML5 que quiser usar em sua página. Assim fará com que o IE versões 6 a 8 renderize o estilo corretamente, com o problema persistindo se tentar imprimir a página. renderizando os novos elementos apropriadamente em páginas impressas pelo ie Felizmente, uma solução conhecida como IE Print Protector resolve o problema da impressão. Mas, em vez de reinventar a roda, recomendamos que você use um script HTML shiv. O HTML5 shiv mais popular foi criado originalmente por Remy Sharp e desde então foi aperfeiçoado por outras pessoas. Para ver mais informações e obter a última versão do script, acesse http://mng.bz/50dt. 36 HTML5 em ação ATENÇÃO: A solução HTML5 shiv requer JavaScript. Se quiser uma solução sem JavaScript, use a solução equivalente com base em XML do HTML5. Consulte o post de Eric Klingen sobre o assunto em http://mng.bz/QBIw. O que mais você pode fazer para incrementar seus aplicativos usando HTML5? Que tal integrar recursos fáceis que modernizem seus formulários? Mesmo estando em todos os lugares, em HTML5 isso não significa que eles tenham de ser tediosos e singelos. 1.1.5 Introduzindo os novos recursos de formulários do HTML5 Raramente ele recebe crédito, mas o simples formulário web tem desempenhado um papel importante na transformação da web em uma plataforma para o desenvolvimento de aplicativos. O direcionamento do HTML5 aos aplicativos web levou a muitas melhorias nos formulários web, e você pode usar todas hoje, sem romper a compatibilidade com navegadores web mais antigos. melhorando a semântica de entrada de dados usando os novos tipos de entrada dos formulários O campo de texto básico tem sido usado para finalidades que vão muito além de seus recursos primitivos. Da mesma forma que o elemento <div> foi usado em HTML4 para qualquer tipo de conteúdo de bloco, a entrada de texto é usada para qualquer tipo de entrada textual. O HTML5 tenta facilitar sua carga oferecendo vários tipos novos e com compatibilidade regressiva, todos apresentando melhorias em relação ao campo de texto simples. A Tabela 1.1 identifica os novos tipos de entrada em HTML5. Tabela 1.1 – Os novos tipos de entrada dos formulários introduzidos no HTML5 color date datetime datetime-local email month number range search tel time url week Você pode usar esses novos tipos de entrada em suas páginas web imediatamente porque os navegadores mais antigos usarão um tipo de entrada de texto padrão quando encontrarem um tipo que não entendam. Alguns dos novos tipos de entrada também permitem que os navegadores forneçam widgets-padrão para determinados tipos de campos de formulário. A figura 1.1 mostra exemplos desses novos widgets. Capítulo 1 ■ HTML5: de documentos a aplicativos 37 Figura 1.1 – Exemplos de alguns dos novos widgets de entrada de formulário introduzidos no HTML5. É bom ressaltar que não são todos os navegadores que já dão suporte aos widgets. No capítulo 2, você conhecerá o Modernizr, um script HTML5 de detecção de recursos. Usando o Modernizr, você poderá detectar se um navegador dá suporte a um determinado tipo de entrada, fornecendo um widget alternativo com JavaScript se necessário. 38 HTML5 em ação novos atributos para a alteração do comportamento dos campos Além dos novos tipos de campo dos formulários, o HTML5 introduz dez atributos comuns, mostrados na tabela 1.2, que nos permitem alterar o comportamento de um campo específico. O atributo placeholder é um exemplo de um desses novos atributos e nos permite definir o texto que aparecerá no campo antes de ele conter um valor. Isso é ilustrado na figura 1.2. Figura 1.2 – Você pode usar o novo atributo placeholder para fornecer um fragmento de texto para ser exibido em um campo quando ele estiver vazio. Normalmente esse texto aparece em cinza e é removido quando o campo é preenchido com um valor. A tabela 1.2 fornece uma lista dos novos atributos de entrada introduzidos no HTML5. Você verá que atributos são aplicados a que tipos de entrada no capítulo 2. Tabela 1.2 – Novos atributos do elemento de entrada do HTML5 autocomplete autofocus list multiple pattern placeholder required max min step novos atributos para a execução de validação no lado do cliente Alguns desses atributos permitem que o navegador execute validação no lado do cliente sem JavaScript. Por exemplo, o atributo required especifica que um campo deve ser preenchido ou o navegador gerará um erro. O atributo pattern nos permite definir uma expressão regular de acordo com a qual o valor da entrada será testado. Os atributos max e min nos permitem restringir os valores máximo de mínimo nos tipos de campos number e date. Além disso, o navegador executará a validação em alguns dos novos tipos de entrada para avisar aos usuários se eles tiverem inserido valores no formato incorreto. Se o usuário inserir um endereço de email inválido em um campo de entrada email, por exemplo, o navegador indicará o erro e impedirá que o formulário seja enviado para o servidor. ATENÇÃO: Você nunca deve confiar somente na validação no lado do cliente, seja ela a nova validação HTML5 nativa do navegador ou um código de validação JavaScript. É fácil burlar a validação no lado do cliente, logo, você deve sempre verificar a entrada no lado do servidor. A validação no lado do cliente deve ser usada para melhorar a experiência do usuário e não como segurança do aplicativo. Capítulo 1 ■ HTML5: de documentos a aplicativos 39 Você aprenderá muito mais sobre os novos tipos e atributos de entrada no capítulo 2. Primeiro, mostraremos os outros novos elementos introduzidos no HTML5 que você pode integrar fácil e imediatamente em seus aplicativos. 1.1.6 Barras de progresso, medidores e conteúdo colapsável O HTML5 define uma série de novos elementos que você pode usar para dar informações para o usuário. São widgets, como barras de progresso, medidores e seções colapsáveis, que no passado os desenvolvedores precisavam tirar de bibliotecas JavaScript de terceiros. usando barras de progresso para exibir o percentual de conclusão O elemento <progress> nos permite apresentar para o usuário uma barra de progresso determinada ou indeterminada. Uma barra de progresso determinada tem um valor específico e é preenchida até esse valor – isso é útil para exibir o progresso do upload de um arquivo, em que atualizamos dinamicamente o valor da barra de progresso à medida que ocorre o upload. Uma barra de progresso indeterminada não tem um valor específico e a barra aparece cheia, mas animada – ela é útil para informar ao usuário que o aplicativo está sendo carregado quando você não tiver certeza do progresso exato da operação. Um exemplo dos dois tipos de barra de progresso é mostrado na figura 1.3. Figura 1.3 – A barra de progresso da esquerda é um exemplo de barra determinada. Nesse exemplo, o valor da barra está configurado com 50% e a aparência reflete isso porque está preenchida até a metade. A barra de progresso da direita é uma barra indeterminada e não tem um valor. Ela é exibida como uma barra cheia e animada para indicar que algo está ocorrendo, mas o percentual de conclusão não é conhecido. O código para a criação das barras de progresso da figura 1.3 é o seguinte: <progress value="50" max="100"></progress> ❶ <progress></progress> ❷ ❶A barra de progresso determinada deve ter um valor e opcionalmente um atributo max. ❷ A barra de progresso indeterminada não tem um valor. 40 HTML5 em ação usando medidores para exibir medidas dentro de intervalos conhecidos O elemento <meter> segue o mesmo caminho do elemento <progress>. Você usaria o elemento <progress> principalmente para exibir o percentual de conclusão de uma tarefa e usaria o elemento <meter> para fornecer a representação de uma medida escalar dentro de um intervalo conhecido. Além de exibir o valor usando um gráfico de barras preenchido, o elemento <meter> permite definir os intervalos baixo, alto e ótimo que você pode usar para dar mais exatidão. Quando o valor está no intervalo baixo, o medidor é exibido em vermelho; no intervalo médio, ele é exibido em amarelo; e nos intervalos alto e ótimo, é exibido em verde. A figura 1.4 ilustra as aparências que o elemento <meter> pode ter. Figura 1.4 – Uma tomada de tela dos estados em que você pode representar um elemento <meter>: vazio, baixo, médio, alto e cheio. A seguir temos o código do elemento <meter> da figura 1.4: <meter <meter <meter <meter <meter min="0" min="0" min="0" min="0" min="0" max="10" max="10" max="10" max="10" max="10" low="3" low="3" low="3" low="3" low="3" high="7" high="7" high="7" high="7" high="7" optimum="9" optimum="9" optimum="9" optimum="9" optimum="9" value="0"></meter> ❶ value="1"></meter> value="4"></meter> value="7"></meter> value="10"></meter> ❶ Defina os intervalos de um medidor usando os atributos min, max, low, high e optimum. usando details e summary para criar conteúdo colapsável sem javascript No passado, a única maneira de criar seções de conteúdo colapsáveis era usando JavaScript para alternar a propriedade CSS display da seção e exibi-la ou ocultá-la. O HTML5 introduziu os elementos <details> e <summary> como um meio de proporcionar essa funcionalidade sem script. A figura 1.5 ilustra esses novos elementos em ação: Capítulo 1 ■ HTML5: de documentos a aplicativos 41 Figura 1.5 – Um exemplo dos elementos <details> e <summary> em ação, primeiro no estado fechado, em que só o código do elemento <summary> fica visível, e depois no estado aberto, em que todo o conteúdo do elemento <details> pode ser visto. O código que cria o exemplo de <details> e <summary> é: <details> <summary>Section Heading</summary> This is an example of using &lt;details&gt; and &lt;summary&gt; to create collapsible content without using JavaScript. </details> Infelizmente, o suporte dos navegadores a esses novos elementos tem sido bem lento até agora. Felizmente, é simples fornecer uma alternativa com o uso de JavaScript e várias podem ser encontradas em http://mng.bz/cJhc. Usando as técnicas aprendidas nesta seção, você deve poder atualizar seus aplicativos para que usem convenções HTML5 sem produzir um impacto negativo sobre os usuários que não tiverem o navegador mais moderno. Na próxima seção, aprenderá como levar as coisas um passo adiante indo além da marcação HTML e usando conceitos relacionados como CSS3 e JavaScript para melhorar o estilo e a interatividade de seus documentos. 1.2 Além da marcação: padrões web adicionais Como mencionamos, a web não é mais apenas para documentos; é uma plataforma para o desenvolvimento de aplicativos. Portanto o HTML5 não inclui apenas marcação para a descrição da estrutura de documentos; ele também engloba muitos outros recursos e especificações associadas para assegurar que os aplicativos tenham uma ótima aparência e forneçam a melhor experiência possível para o usuário. Um exemplo disso são os microdados e a API Microdata associada, que permitem que você forneça semânticas adicionais em seus documentos e depois as recupere e modifique. Outro exemplo é o CSS3; suas folhas de estilos aperfeiçoadas permitem que você aplique o que há de mais novo em estilização e efeitos – sem depender de imagens externas e hacks JavaScript. 42 HTML5 em ação Nesta seção, você aprenderá • Como usar microdados e vocabulários de microdados para fornecer aos mecanismos de busca melhores informações sobre suas páginas. • A API de microdados do DOM que permite a recuperação e a modificação dinâmica de itens de microdados com o uso de JavaScript. • Vários dos novos recursos CSS3 que permitem melhorar o apelo visual dos aplicativos e ao mesmo tempo fornecem melhor interação e feedback para o usuário. • Como o HTML5 considera o JavaScript um recurso de primeira classe com especificações detalhadas e APIs avançadas. Para começar, examinemos os microdados. 1.2.1 Microdados Os microdados do HTML5 permitem que você adicione informações semânticas a uma página web, que por sua vez podem ser usadas por aplicativos como mecanismos de busca e navegadores web no fornecimento de funcionalidades adicionais para o usuário com base nesses dados. Um exemplo de como o Google usa microdados para fornecer resultados de pesquisa inteligentes é ilustrado na figura 1.6. Figura 1.6 – O Google lê microdados de documentos HTML para fornecer melhores resultados de pesquisa para os usuários. Usando microdados em suas páginas, você permitirá que o Google forneça listagens de resultados de pesquisa semelhantes para seu site ou aplicativo. Para usar microdados, você precisa de um vocabulário que defina a semântica a ser usada. Você pode definir seus próprios vocabulários, mas provavelmente vai querer usar um vocabulário publicado, como os fornecidos pelo Google em www.data-vocabulary.org/, que incluem Event, Organization, Person, Product, Capítulo 1 ■ HTML5: de documentos a aplicativos 43 Review, Review-aggregate, Breadcrumb, Offer e AggregateOffer. Usando um vocabulário publicado, você terá certeza de que os mecanismos de busca e outros aplicativos interpretarão seus microdados consistentemente. A listagem 1.5 ilustra os microdados em ação usando um item de evento que adota o vocabulário Event do Google tirado de www.data-vocabulary.org/Event. Essa listagem cria um fragmento de código HTML para um evento, com a definição de propriedades de microdados que permitirão que um mecanismo de busca interprete sem ambiguidade as informações do evento e use-as para melhorar os resultados da pesquisa, talvez exibindo a data do evento em um calendário ou como um local em um mapa. u Listagem 1.5 html5-microdata.html – Os microdados em ação <div itemscope itemtype="http://data-vocabulary.org/Event"> ❶ <a href="http://example.com/event/1" itemprop="url"> ❷ <span itemprop="summary">John's 40th Birthday Party</span> </a> <span itemprop="description">To celebrate John turning 40, we're throwing a BBQ party in his honour this Friday evening at close of business. Please come and bring your friends and family!</span> Location: <span itemprop="location" itemscope itemtype=http://data-vocabulary.org/Address> <span itemprop="street-address">500 Market Way</span> <span itemprop="locality">Ballincollig</span> <span itemprop="region">Cork</span> </span> Date and Time: <time itemprop="startDate" datetime="2011-05-06T18:00+00:00"> Fri, May 6th @ 6pm </time> </div> ❶ O atributo itemscope informa ao analisador que esse elemento e tudo que existe dentro dele descrevem a entidade que está sendo referenciada. O valor desse atributo é booleano e geralmente é omitido. O atributo itemtype define o URL em que o vocabulário para o item que está sendo especificado é encontrado. 44 HTML5 em ação ❷ O atributo itemprop indica o nome da propriedade de microdados à qual o conteúdo do elemento deve ser atribuído. Esse atributo é o que provavelmente você usará mais quando estiver trabalhando com microdados. A especificação HTML5 também define uma API do DOM que você pode usar para recuperar e modificar itens de dados dinamicamente usando JavaScript. As descrições da API são fornecidas na tabela 1.3. Tabela 1.3 – A API de microdados do DOM Método/propriedade Descrição Obtém todos os elementos que sejam itens de microdados de nível superior (elementos com um atributo itemscope). Você pode document.getItems([types]) usar o argumento types para filtrar por um ou mais valores do atributo itemtype. Obtém todas as propriedades (elementos com um atributo element.properties itemprop) de um determinado item de microdados (element). element.itemValue [= value] Obtém ou configura o valor da propriedade de um item. Usar microdados é uma ótima maneira de melhorar como seu aplicativo (ou documento) aparecerá nos resultados de pesquisas. Na próxima seção, você aprenderá como pode usar o CSS3 para tornar seu aplicativo visualmente interessante com os novos estilos e efeitos que ele tem para oferecer. 1.2.2 CSS3 Se você já faz desenvolvimento na web há muito tempo, deve se lembrar de quando a estilização de documentos HTML era facilitada pelo uso de elementos como <font> e o uso inteligente de elementos <table>. A introdução das Folhas de Estilo em Cascata tornou essas abordagens desnecessárias. Com a evolução da web, os desenvolvedores inventaram novas maneiras de apresentar conteúdo, usando efeitos como sombras projetadas, cantos arredondados e degradês para melhorar o apelo visual de seus aplicativos. Mais impressionante ainda foi o uso de transição e animação para prover o usuário com um feedback e uma interação melhores. O principal problema de todas essas maravilhosas melhorias é que tradicionalmente sua implementação requeria alguns artifícios com o uso de imagens e JavaScript (ou pelo menos o uso de uma biblioteca JavaScript). O CSS3 surgiu para mudar isso. A tabela 1.4 lista alguns dos novos recursos de estilo disponíveis em CSS3 – todos sem JavaScript ou o uso inteligente de imagens. Capítulo 1 ■ HTML5: de documentos a aplicativos 45 Tabela 1.4 – Uma lista parcial dos novos recursos CSS3 Novos seletores Novas pseudoclasses Bordas arredondadas Imagens de borda Dimensionamento Dimensionamento de caixa de plano de fundo Degradês Sombra de caixa Sombra de texto Quebra automática Múltiplas colunas de linha Fontes da web Múltiplos planos de Canais de cor alfa fundo Consultas de mídia Estilo de voz Transições Transformações 3D Transformações 2D Animações À medida que você percorrer os exemplos deste livro, aprenderá a construir aplicativos usando principalmente HTML e JavaScript. Usamos CSS3 na estilização, mas não o examinaremos nos capítulos. Você pode baixar o código CSS de todos os exemplos a partir da página web do livro. Se quiser obter uma visão mais detalhada do CSS3, procure em Hello! HTML5 and CSS3 (Manning, 2012). Rob Crowther, o autor, é um dos coautores do livro que você tem em mãos. 1.2.3 O JavaScript e o DOM O JavaScript e o Document Object Model (DOM) desempenham um papel muito importante nos aplicativos web modernos. A possibilidade de interagir dinamicamente com elementos da página permitiu que os desenvolvedores fornecessem rica funcionalidade e interatividade anteriormente encontradas apenas em aplicativos desktop. O advento do Asynchronous JavaScript and XML (AJAX) eliminou a necessidade das atualizações de página, permitindo que ações no lado do servidor sejam atualizadas inline, o que fornece uma experiência de usuário muito melhor. O JavaScript Object Notation (JSON) se tornou o formato-padrão de intercâmbio de dados para aplicativos web e a maioria das linguagens e frameworks de servidor já dá suporte a ele nativamente. Além disso, surgiram poderosos frameworks e bibliotecas para fornecer uma abstração de JavaScript que permite que os desenvolvedores se preocupem menos com as inconsistências entre navegadores existentes nos primórdios do desenvolvimento web e se concentrem mais na construção de aplicativos altamente funcionais. ATENÇÃO: Todos os capítulos do livro mostram como construir aplicativos poderosos com o uso de HTML5 e JavaScript. Mas este não é um livro para iniciantes em JavaScript. No mínimo, você deve conhecer a sintaxe e aspectos básicos do JavaScript como as declarações de variáveis, instruções condicionais, funções, closures. callbacks e escopos assim como outros conceitos como AJAX, JSON e a interação com o DOM. Se você tiver experiência no uso de bibliotecas 46 HTML5 em ação JavaScript como o jQuery, deve conseguir acompanhar. Para aprender mais sobre JavaScript ou se estiver se sentindo desatualizado, leia o livro Ajax in Action (Manning, 2005) de David Crane, Eric Pascarello e Darren James e Segredos do Ninja JavaScript (Novatec, 2013) de John Resig e Bear Bibeault. Em versões anteriores da especificação HTML (e XHTML), a única menção feita ao JavaScript aparecia em uma seção menor sobre o uso do elemento <script> e alguns dos atributos que poderiam ser adicionados a elementos HTML para fornecer funcionalidade de manipulação de eventos. Em HTML5, o JavaScript é tratado como um recurso de primeira classe, com cada seção da especificação detalhando quais métodos e propriedades de APIs do DOM estão disponíveis para cada elemento. Além disso, o HTML5 define APIs avançadas que permitem que você desenvolva aplicativos que usem áudio e vídeo, trabalhem offline, armazenem dados localmente no cliente e muito mais. Abordaremos essas APIs brevemente mais adiante neste capítulo e com mais detalhes no decorrer do livro. HTML5 vs. HTML Living Standard vs. HTML5 para desenvolvedores web A especificação HTML5 tem uma longa história. Se não nos prendermos a detalhes, o resultado final é que ela tem duas versões, ambas com o mesmo editor: Ian Hickson do Google. A especificação HTML5 é publicada pelo W3C, enquanto a especificação HTML Living Standard é publicada pelo WHATWG (Web Hypertext Application Technology Working Group). Para deixar as coisas ainda mais confusas, o WHATWG também publicou um documento, “HTML5: A technical specification for web developers”, que é mais conciso e fácil de ler. As especificações são semelhantes em muitos aspectos, mas você encontrará diferenças consideráveis. Por exemplo, a especificação HTML Living Standard inclui várias APIs que são publicadas como especificações totalmente separadas pelo W3C, como Microdata, Web Storage e Web Workers. Para ver as últimas diferenças entre as especificações, consulte “Is this HTML5?” na especificação HTML Living Standard em http://mng.bz/PraC. Neste capítulo, estamos tratando das APIs que existem no HTML Living Standard como “parte do próprio HTML5” e de qualquer API de fora dessa especificação separadamente. Conforme você avançar no livro, verá que não estamos tão preocupados com as diferenças e que todas as novas especificações são tratadas como pertencentes ao “HTML5”. Para ver uma discussão adicional sobre as diferenças entre as versões do WHATWG e do W3C assim como as diferenças de abordagem entre esses dois grupos, consulte o Apêndice A. Na próxima seção, examinaremos as APIs do DOM incluídas atualmente na especificação HTML5. Capítulo 1 ■ HTML5: de documentos a aplicativos 47 1.3 As APIs do DOM incluídas no HTML5 Existem APIs do DOM para quase tudo em HTML5. Na verdade, muitas já existem há bastante tempo, mas nunca foram definidas na especificação HTML. Elas incluem recursos que nos permitem acessar um elemento do DOM por seu atributo ID e manipular valores de elementos de formulário. Tudo isso foi incluído no HTML5 e a especificação também define novas APIs do DOM para o desenvolvimento de aplicativos avançados, muitas das quais não estão de forma alguma associadas a elementos HTML. Esta seção fornece uma visão geral das novas APIs do DOM incluídas no HTML5: • • • • • • • • • Canvas 2D (2D Canvas) Áudio e vídeo (Audio and Video) Arrastar e soltar (Drag and Drop) Troca de mensagens entre documentos (Cross-Document Messaging) Eventos enviados pelo sevidor (Server-Sent Events) WebSockets Edição de documentos (Document Editing) Armazenamento web (Web Storage) Aplicativos web offline (Offline Web Applications) Abordaremos todos esses tópicos com mais detalhes no decorrer do livro, com exemplos totalmente funcionais que geralmente integram várias APIs ao mesmo tempo. Neste capítulo, você terá uma visão geral do que está para vir, começando com o novo elemento <canvas> e a API associada. 1.3.1 Canvas O HTML5 fornece vários elementos que nos permitem apresentar informações em uma página web. Podemos estilizá-los de muitas maneiras diferentes e usar JavaScript para animá-los e aplicar efeitos dinâmicos. Se você se sente confortável com códigos JavaScript complexos (e acha que seus usuários estarão executando navegadores de alto desempenho), saiba que é possível fazer coisas fantásticas com HTML e JavaScript. O problema é que os designers e desenvolvedores podem querer implementar algo que o HTML não forneça. E se você quiser inserir um círculo, um quadrado ou outra forma? E se quiser exibir uma imagem e alterá-la dinamicamente de acordo com as seleções do usuário? Você poderia usar imagens estáticas ou uma solução no lado do servidor, mas essas alternativas não são ótimas. A única solução viável tem sido usar um plugin de terceiros como o Adobe Flash. 48 HTML5 em ação O HTML5 introduz o elemento <canvas> e uma série de APIs de desenho relacionadas que permitirão que você faça coisas maravilhosas, sem requerer que o usuário instale um plugin. O nome do elemento <canvas> descreve bem esse novo recurso: ele é uma tela para o desenho de páginas web. A figura 1.7 mostra um jogo, “Canvas Break”, que criamos totalmente em HTML5 e JavaScript, com os recursos visuais do jogo sendo exibidos em um elemento <canvas>. Excelente, não? Você aprenderá como usar a API Canvas ao construir esse jogo por sua própria conta no capítulo 6. Figura 1.7 – O elemento <canvas> permite que os desenvolvedores apresentem informações de maneiras mais criativas. Você aprenderá como construir esse jogo no capítulo 6. A API Canvas define um contexto 2D, que fornece uma série de métodos para o desenho na tela. São métodos para a criação de formas, definição de caminhos, uso de cores e degradês, fornecimento de texto e muito mais. A API também fornece para os desenvolvedores uma maneira de exportar o conteúdo atual da tela como uma imagem no formato PNG ou JPG usando URLs de dados ou objetos Blob. 1.3.2 Áudio e vídeo Grande parte da banda larga da Internet nos últimos anos tem sido direcionada à distribuição de conteúdo multimídia: vídeo e áudio. Atualmente, a maioria dos vídeos da web é distribuída no formato de vídeo Flash (FLV), um contêiner do Adobe Flash para vários tipos de codec de vídeo. Se os usuários tiverem um plugin Flash instalado, poderão ver o vídeo. Alguns desenvolvedores levantaram questões sobre a segurança e o desempenho do Flash como plataforma para a distribuição de vídeo e estão procurando soluções alternativas. Além disso, a falta de suporte ao Flash nos dispositivos móveis significa que se você quiser que seu conteúdo multimídia esteja disponível em dispositivos como o iPad, isso não vai ocorrer. Capítulo 1 ■ HTML5: de documentos a aplicativos 49 O HTML5 fornece uma solução para isso com os novos elementos <video> e <audio>, que permitem que arquivos multimídia com suporte sejam reproduzidos nativamente pelo navegador, sem a necessidade de plugins de terceiros. Um exemplo é mostrado na figura 1.8. Figura 1.8 – Vídeo sobre HTML5 do YouTube em ação. Como você pode ver pelo código no inspetor, o vídeo do YouTube dessa tomada de tela não usa o plugin Adobe Flash e é totalmente implementado com o uso do elemento HTML5 <video> e de APIs relacionadas. Tanto o elemento <video> quanto o elemento <audio> dão suporte ao elemento <track>, que você pode usar para distribuir conteúdo de texto associado, como as legendas. Você pode usar o elemento <source> para fornecer vários formatos de arquivo e assegurar que os visitantes consigam desfrutar do conteúdo, independentemente do sistema operacional ou navegador que estiverem usando. O HTML5 também define uma API com uma série de métodos para o controle da reprodução de um arquivo de vídeo ou áudio. São métodos para reprodução, pausa, avanço, retrocesso, ajuste do volume e outros. Você conhecerá essas APIs com detalhes quando construir uma jukebox de vídeo funcional com recursos de teleilustração no capítulo 8. 1.3.3 Arrastar e soltar A falta de interatividade fornecida pelo recurso de “arrastar e soltar” é um problema que há muito tempo aflige os desenvolvedores de aplicativos web. Esse tipo de funcionalidade tem predominado em aplicativos desktop desde o surgimento das UIs gráficas. Como resultado, os usuários esperam poder arrastar objetos pelos aplicativos e às vezes ficam surpresos ao ver que seus aplicativos web favoritos não fazem isso. 50 HTML5 em ação As tentativas de implementar o recurso de arrastar e soltar no navegador começaram no fim dos anos 90, com o Netscape 4.0 fornecendo uma implementação básica e a Microsoft vindo a seguir com uma oferta mais completa no IE 5.0. Na época, ela foi vista como uma extensão do IE, não padrão e específica do navegador, mas com o tempo outros fornecedores de navegador adotaram a mesma API, levando à sua eventual inclusão no HTML5. A boa notícia é que o recurso de arrastar e soltar do HTML5 tem suporte em todos os navegadores modernos, inclusive no IE desde a versão 5.0. E a má notícia é que a implementação original da Microsoft que foi usada é, na verdade, terrível. Ian Hickson, o editor da especificação HTML5, uma vez tuitou: “A API de arrastar e soltar é horrível, mas tem uma coisa a seu favor: o IE a implementa, assim como o Safari e o Firefox.” Para usar o recurso de arrastar e soltar em HTML5, você pode empregar o atributo draggable em um elemento para definir explicitamente que ele pode ser arrastado. (Muitos elementos, como as imagens, podem ser arrastados por padrão.) Você pode então usar uma série de eventos para escutar alterações quando o usuário arrastar o elemento para dentro e para fora de outros elementos e, claro, quando o usuário soltar o elemento. A API permite que você defina os dados que deseja associar à operação de arrastar e leia-os novamente ao soltar. Um novo recurso da operação de arrastar e soltar do HTML5 é que você pode arrastar arquivos de seu computador e soltá-los em um aplicativo web. Um exemplo dessa funcionalidade pode ser visto no Gmail, como mostrado na figura 1.9. Figura 1.9 – O Gmail permite que você arraste arquivos para a janela do navegador e solte-os em uma área designada para adicioná-los como anexos a suas mensagens. Você aprenderá como usar o recurso de arrastar e soltar para importar e exportar arquivos a partir de um aplicativo no capítulo 3. Capítulo 1 ■ HTML5: de documentos a aplicativos 51 1.3.4 Troca de mensagens entre documentos, eventos enviados pelo servidor e WebSockets Os aplicativos web funcionam em um modelo de solicitação e resposta em que o cliente emite uma solicitação para o servidor e esse envia uma resposta para o cliente. Se depois o cliente precisar de mais informações do servidor, ele tem de iniciar outra solicitação. Isso torna difícil enviar alterações do servidor para o cliente sem ser preciso enviar frequentemente solicitações para a procura dessas alterações. Nesta seção, você conhecerá alguns dos novos recursos de troca de mensagens do HTML5 que permitem que o servidor se comunique com o cliente. Mas antes examinaremos como usar a troca de mensagens para enviar atualizações entre documentos. permitindo a comunicação entre clientes com a troca de mensagens entre documentos e por canais Quando trabalhar com aplicativos web que usem múltiplas janelas do navegador, com frequência você vai querer passar mensagens entre os documentos de cada janela. Normalmente, isso era feito com o uso da manipulação direta do DOM. Por exemplo, um sistema antigo de reservas aéreas poderia abrir um widget de calendário em uma nova janela do navegador, e quando o usuário clicasse em uma data, ele manipularia diretamente o valor do campo de data do formulário na janela-pai. Um problema da manipulação direta do DOM é que ela conecta diretamente os dois documentos; cada documento precisa ter um conhecimento detalhado da estrutura do outro documento para manipularem um ao outro e compartilhar informações. O HTML5 fornece uma solução muito melhor na forma da troca de mensagens entre documentos e da troca de mensagens por canais, ilustrada na figura 1.10. A troca de mensagens entre documentos permite que os documentos se comuniquem um com o outro via mensagens – um documento envia uma mensagem e o outro tem um manipulador de eventos registrado para escutar qualquer mensagem enviada pelo primeiro documento. Outro problema da manipulação direta do DOM surge se considerarmos a segurança da inclusão de arquivos de script remotos no aplicativo – um caso de uso comum na implementação de coisas como os botões “Curtir” do Facebook e do Google Analytics nos aplicativos. Esses scripts têm acesso total ao DOM – não é possível dar a eles apenas acesso parcial quando carregados dessa forma. A troca de mensagens entre documentos funciona entre domínios, permitindo que mensagens sejam enviadas entre os aplicativos sem expormos o DOM de cada aplicativo. 52 HTML5 em ação Figura 1.10 – Um aplicativo simples que demonstra a troca de mensagens por canais. Você o construirá no apêndice J, um dos apêndices que acompanham o capítulo 4. permitindo comunicações unidirecionais do servidor para o cliente com eventos enviados pelo servidor A troca de mensagens entre documentos é um ótimo meio de comunicação entre dois clientes – mas e se você quiser permitir que seu servidor web envie mensagens que possam ser lidas pelo navegador? Os eventos enviados pelo servidor foram projetados para isso. Usando a interface EventSource, seu aplicativo poderá se registrar em um fluxo de eventos do lado do servidor, que só receberá mensagens quando o servidor enviar uma atualização. Essa é uma melhoria considerável em comparação com abordagens como a sondagem longa do AJAX, que pode ser difícil de implementar. Ela funciona bem para um aplicativo de bate-papo, em que você pode postar novas mensagens usando o AJAX e receber mensagens de outros usuários pelo fluxo de eventos. A figura 1.11 é uma tomada de tela desse tipo de aplicativo, que você construirá posteriormente. Figura 1.11 – Um aplicativo de bate-papo implementado com o uso de eventos enviados pelo servidor. Capítulo 1 ■ HTML5: de documentos a aplicativos 53 permitindo comunicações bidirecionais entre servidor e cliente com websockets A desvantagem óbvia dos eventos enviados pelo servidor é que eles só facilitam a comunicação unidirecional – as mensagens só podem ser enviadas do servidor para o cliente, e não vice-versa. Se você precisa de comunicação bidirecional, o HTML5 fornece os WebSockets – bare-bones em rede entre clientes e servidores, sem o overhead associado ao HTTP. Os WebSockets são ótimos para a passagem de pequenas quantidades de dados rapidamente, o que é crucial em aplicativos como os jogos multiplayer online e sistemas financeiros de tempo crítico. No capítulo 4, você aprenderá como usar todas essas três novas tecnologias de troca de mensagens ao construir um aplicativo de bate-papo simples e um quadro de planejamento multiusuário, com o uso de eventos enviados pelo servidor e WebSockets via Node.js, e permitir que eles se comuniquem através da troca de mensagens entre documentos. 1.3.5 Edição de documentos Anteriormente neste capítulo, falamos sobre os novos recursos de formulário do HTML5. Os formulários web são uma ótima maneira de capturar entradas de usuário simples sem criptografia, mas eles não permitem que o usuário edite conteúdo HTML. É claro que você poderia carregar o código-fonte HTML em um elemento <textarea> e permitir que o usuário o editasse, mas não seria ótimo se pudesse permitir que o usuário editasse o conteúdo usando uma série de controles de edição de rich-text? O HTML5 define dois novos atributos que nos permitem fornecer a edição de rich-text em documentos HTML. O primeiro, contenteditable, pode ser definido em qualquer elemento HTML da página para tornar esse elemento editável. O segundo, designMode, pode ser definido no próprio documento HTML para tornar o documento inteiro editável. Esses atributos têm suporte em todos os navegadores modernos e foram introduzidos originalmente pela Microsoft no IE 5.5. Quando um elemento ou documento é editável, podemos manipular seu conteúdo usando o método document.execCommand, que faz parte da API de edição do DOM incluída no HTML5. Esse método aceita uma ampla seleção de comandos que serão aplicados à seleção ou ao bloco atual, como Bold, Italic, CreateLink e muitos outros. Um exemplo do tipo de editor que você pode criar com essa funcionalidade é mostrado na figura 1.12; e o que é melhor, você aprenderá como usar esses novos recursos quando construir o editor de rich-text no capítulo 3. 54 HTML5 em ação Figura 1.12 – O aplicativo Super HTML5 Editor que você aprenderá a construir no capítulo 3 usa o atributo designMode e a API de edição do DOM para permitir que os usuários editem marcação HTML usando um conjunto de controles de edição de rich-text. A barra de ferramentas dessa tomada de tela permite que você use os comandos de formatação Bold, Italic, Underline, Strikethrough, List, Link e Image no conteúdo da área abaixo da barra. 1.3.6 Armazenamento web Por muitos anos, os aplicativos web usaram cookies para armazenar no cliente pequenos grupos de dados que persistiam durante a sessão ou entre várias sessões. Essa é a tecnologia existente por trás dos sistemas de autenticação na web – eles armazenam no cliente um cookie que contém algum tipo de identificador usado para que o aplicativo saiba quem fez login. Os cookies apresentam vários problemas, que os tornam menos úteis para o armazenamento de qualquer coisa que não seja os grupos menores de dados. O primeiro problema é que a maioria dos navegadores limita o tamanho dos cookies a 4 quilobytes e o número de cookies armazenados por domínio a 20. Ao alcançar esses limites, o navegador começa a descartar os cookies mais antigos para abrir caminho para os mais novos, o que significa que não há garantia de que os manterá. Outro problema é que, quando um aplicativo usa cookies, eles Capítulo 1 ■ HTML5: de documentos a aplicativos 55 são enviados em cada solicitação HTTP feita para a sessão, adicionando overhead a todas as transações. Isso talvez não seja um problema se você estiver usando um ou dois cookies, mas e se usar vários? E considere que os cookies serão enviados junto com cada solicitação HTTP – retardando cada carregamento de página e solicitação AJAX que seu aplicativo fizer. A API Web Storage do DOM fornece um substituto JavaScript aos cookies para ser usado nos aplicativos web. Ela define duas interfaces: • sessionStorage – Armazenamento de dados no lado do cliente que só persiste durante a sessão atual • localStorage – Armazenamento de dados no lado do cliente que persiste por várias sessões Essas APIs expõem métodos que permitem que os desenvolvedores armazenem simples dados de pares chave/valor em um depósito no lado do cliente. Os itens de dados armazenados com o uso dessas interfaces só podem ser acessados por páginas do mesmo domínio. No capítulo 5, você construirá o aplicativo mostrado na figura 1.13, que armazena configurações de usuário no armazenamento local. Figura 1.13 – No capítulo 5, você aprenderá como usar a interface localStorage para fazer as configurações do usuário persistirem em um aplicativo móvel de gerenciamento de tarefas. Embora a API Web Storage possa armazenar megabytes de dados (5 megabytes é o limite imposto pela maioria dos navegadores), ela não é ideal para o armazenamento de estruturas de dados complexas que normalmente seriam armazenadas em 56 HTML5 em ação um banco de dados. Posteriormente neste capítulo, você conhecerá o IndexedDB, que define uma API de banco de dados totalmente indexado para o armazenamento de dados localmente no cliente. 1.3.7 Aplicativos web offline Atualmente, parece que estamos permanentemente online – nossas conexões de Internet estão sempre ativas, nossos dispositivos móveis têm planos de dados que operam por redes de dados de celular, e agora podemos nos conectar até mesmo em viagens aéreas. Mesmo assim, em alguns momentos ainda podemos ter de conseguir trabalhar offline. Sua conexão de rede pode estar inoperante ou você poderia estar no exterior e não querer pagar taxas exorbitantes de roaming de dados. Também poderia estar usando um dos poucos dispositivos que não têm conexão de dados wireless. Há muito tempo já existem soluções para o salvamento de documentos HTML para uso offline. Embora sejam úteis para a leitura de conteúdo estático, como notícias, elas são inúteis quando se trata de aplicativos web. O HTML5 dá um passo adiante no salvamento de documentos, dando aos desenvolvedores a oportunidade de definir um arquivo de manifesto de cache para estabelecer como os arquivos de seus aplicativos devem ser armazenados em cache para uso offline. O arquivo de manifesto de cache também pode definir os arquivos que não devem ser armazenados em cache para uso offline. Nesse caso, uma alternativa pode ser fornecida para ser carregada pelo navegador quando o usuário estiver offline. Isso permite que você forneça arquivos separados para uso online e offline. Um exemplo de caso de uso poderia ser o de um aplicativo que salvasse dados no banco de dados de um servidor. Quando online, o aplicativo executaria solicitações AJAX para recuperar e atualizar dados nesse banco de dados. Em segundo plano, ele armazenaria dados localmente em um banco de dados IndexedDB, sobre o qual falaremos em uma seção posterior. Quando o usuário estivesse offline, o aplicativo carregaria um arquivo JavaScript projetado especificamente para uso no modo offline. Em vez de disparar solicitações AJAX para o servidor, ele recuperaria e modificaria os dados no banco de dados IndexedDB local. Na próxima vez que o usuário se conectasse com a rede, o aplicativo poderia então enviar os dados do banco de dados local para o banco de dados no lado do servidor. No capítulo 5, você aprenderá como desenvolver o aplicativo web capaz de operar offline mostrado na figura 1.14. Capítulo 1 ■ HTML5: de documentos a aplicativos 57 Figura 1.14 – Uma tomada de tela do aplicativo móvel com recursos offline que você criará no capítulo 5. 1.4 APIs e especificações adicionais Como já vimos, a família HTML5 não para na especificação HTML5. Existem várias outras tecnologias e especificações que definem novas funcionalidades, que os fornecedores de navegadores modernos estão incluindo regularmente em suas últimas versões, como a API Geolocation; a API IndexedDB; as APIs File Reader, File Writer e File System; o SVG e o WebGL. Nesta seção, você aprenderá • A API Geolocation e como usá-la para determinar a localização geográfica de um usuário • A API IndexedDB e como ela permite armazenar um bando de dados inteiro no lado do cliente • Especificações orientadas a arquivos e como você pode usá-las para manipular e armazenar arquivos localmente no sistema de arquivos do usuário • O SVG e o WebGL e como eles estão permitindo que os desenvolvedores produzam elementos gráficos vetoriais e animações 3D de altíssima qualidade na web Falaremos sobre cada especificação auxiliar, mas ainda assim importante, começando com a de geolocalização. 58 HTML5 em ação 1.4.1 API Geolocation À medida que o uso de dispositivos móveis aumentava nos últimos anos, o mesmo ocorria com o uso de aplicativos de informações de localização. Os sensores do Global Positioning System (GPS) encontrados nos smartphones modernos permitem que os aplicativos localizem os usuários com alto grau de precisão. Quando o GPS não está disponível (se o dispositivo não tiver um sensor ou se o usuário estiver fora do alcance do satélite), os dispositivos podem usar alternativamente outros meios de rastrear a localização, usando informações como a rede de celular, a rede Wi-Fi ou o endereço IP. A API Geolocation define métodos que permitem que os aplicativos web encontrem a localização de um usuário. Quando esses métodos são chamados, o navegador informa ao usuário que o aplicativo está solicitando acesso à sua localização. O usuário pode então optar por aceitar ou rejeitar essa solicitação, o que assegura que os aplicativos não rastreiem a localização do usuário sem sua permissão anterior. Se o usuário aceitar a solicitação, a API fornecerá ao aplicativo uma série de dados sobre sua localização, inclusive coordenadas (latitude e longitude), altitude, direção e velocidade, assim como o nível de precisão do resultado. Você aprenderá a empregar a geolocalização no capítulo 3, onde a usará para obter a localização atual do usuário e incluir um mapa dessa localização em um documento HTML (Figura 1.15). Figura 1.15 – Adicionando mapas que exibem sua localização atual no aplicativo do capítulo 3. Capítulo 1 ■ HTML5: de documentos a aplicativos 59 1.4.2 Banco de dados indexado (API IndexedDB) A API IndexedDB fornece aos desenvolvedores um meio de armazenar estruturas de dados complexas em um banco de dados totalmente no lado do cliente. Sua principal vantagem sobre a API Web Storage é que em Web Storage o único índice é a chave do par chave/valor, enquanto em IndexedDB os valores também são totalmente indexáveis, o que a torna uma solução mais viável para qualquer aplicativo onde seja preciso pesquisar ou filtrar dados. A desvantagem é que a API IndexedDB é muito mais complexa e no início pode ser difícil manipulá-la. O IndexedDB é relativamente novo na família de especificações HTML5. Houve uma proposta de solução diferente, o Web SQL (Structured Query Language), uma especificação que definia um banco de dados relacional no lado do cliente que usava instruções SQL na consulta e na manipulação de dados. Acabou sendo deixado de lado porque todos os navegadores que o adotaram estavam usando a mesma implementação (um banco de dados SQLite), logo, nunca teria atendido os critérios de padronização do WHATWG e do W3C de haver “duas implementações independentes e interoperáveis de cada recurso”. Quando ele foi abandonado, o suporte já tinha sido incluído em vários navegadores, entre eles navegadores móveis como o Mobile Safari e o Android. O suporte dos navegadores ao IndexedDB tem ocorrido lentamente, e, como resultado, a maioria dos aplicativos que usa o IndexedDB também usa o Web SQL como alternativa. No capítulo 5, você aprenderá como usar o IndexedDB (com o Web SQL como alternativa) para armazenar dados de tarefas em um aplicativo de tarefas móvel, como ilustrado na figura 1.16. 1.4.3 APIs File, File Reader, File Writer e File System Normalmente é complicado trabalhar com arquivos em aplicativos web. O único meio nativo de permitir que os usuários selecionassem arquivos em seus computadores era usar o tipo de entrada arquivo, que é considerado inadequado, principalmente quando se trata de estilizar a UI do widget. Quando o usuário selecionava um arquivo, o aplicativo tinha de carregá-lo inteiro no servidor para poder fazer algo com ele. Embora estejam disponíveis opções com base em Flash e JavaScript que fornecem uma funcionalidade aperfeiçoada, elas não são ideais, dado que requerem um plugin de terceiros. 60 HTML5 em ação Figura 1.16 – O aplicativo do capítulo 5 usará o IndexedDB para armazenar uma lista de tarefas e nos permitir classificar e pesquisar rapidamente. A família HTML5 inclui várias especificações relacionadas com base em arquivos que prometem tornar muito mais fácil o trabalho com arquivos em aplicativos web. A API File permite que os desenvolvedores obtenham uma referência a um objeto arquivo em JavaScript, lendo propriedades como seu nome, tamanho e tipo MIME. Você pode usar a API File Reader para ler um objeto arquivo, em sua totalidade ou parcialmente em blocos. Da mesma forma, pode usar a API File Writer para gravar dados em um arquivo. A API File System permite que os desenvolvedores manipulem objetos arquivo em um sistema de arquivos local protegido no cliente. Isso permite que você execute grande parte da interação com o arquivo no cliente, diminuindo significativamente a carga no servidor. Não é preciso mais fazer o upload do arquivo inteiro no servidor só para descobrir que ele tem o tipo MIME errado e então ter de informar ao usuário que o arquivo não era do tipo certo. É possível imaginar o quanto isso era incômodo para os usuários após eles terem feito o upload de um arquivo grande. Você usará todas essas APIs para fornecer um sistema de arquivos local completo, e abordaremos onde os arquivos HTML serão armazenados no capítulo 3. Uma tomada de tela de como podemos usar algumas dessas funcionalidades pode ser vista na figura 1.17. Capítulo 1 ■ HTML5: de documentos a aplicativos 61 Figura 1.17 – O Super HTML5 Editor que você construirá no capítulo 3 lhe permitirá executar operações de arquivo como criar um novo arquivo em branco e importar um arquivo existente selecionando-o ou arrastando-o para o aplicativo. Ele armazenará esses arquivos em um sistema de arquivos local no modo seguro, a partir do qual você poderá visualizar, editar e excluir os arquivos ou exportá-los para seu computador arrastando-os para fora do aplicativo. 1.4.4 Scalable Vector Graphics O Scalable Vector Graphics (SVG) é uma linguagem XML que nos permite criar elementos gráficos vetoriais impactantes usando uma marcação que pode ser estilizada com CSS e manipulada via DOM com o uso de JavaScript. Um dos principais problemas dos elementos gráficos de bitmap é que, quando aumentamos suas dimensões, a qualidade da imagem diminui e produz um resultado “pixelizado”. Os elementos gráficos vetoriais são construídos com o uso de equações matemáticas em vez de pixels e, como resultado, podem ser redimensionados e ficar com uma aparência ótima mesmo em grandes dimensões. 62 HTML5 em ação No capítulo 7, você aprenderá como usar o SVG construindo o aplicativo SVG Aliens (Figura 1.18), um exercício que ilustra como criar formas e objetos complexos usando o SVG, como implementar a detecção de colisões e quais são as vantagens e desvantagens do uso do SVG sobre o elemento <canvas>. Figura 1.18 – O jogo SVG Aliens em ação. Você aprenderá a construir esse jogo em sua totalidade posteriormente neste livro. 1.4.5 Web Graphics Library Por fim, mas nem por isso menos importante, temos o Web Graphics Library (WebGL), uma API JavaScript para a criação de elementos gráficos 3D com o uso do elemento <canvas>. O WebGL é com base no padrão Open Graphics Library for Embedded Systems (OpenGL ES), que foi projetado para a implementação de 3D em dispositivos embutidos, inclusive em telefones móveis. Ele fornece aos desenvolvedores uma API que lhes permite controlar hardware gráfico em baixo nível usando shader, buffer e métodos de desenho. No capítulo 9, você aprenderá não só sobre a API WebGL, mas também sobre a programação de elementos gráficos 3D em geral, inclusive como criar shaders, trabalhar com dados usando buffers, agrupar dados 3D na tela usando a manipulação de matrizes e muito mais. Você executará essas tarefas usando nosso exemplo de aplicativo, que o fará construir um jogo 3D, o Geometry Destroyer, cuja tomada de tela pode ser vista na figura 1.19. Capítulo 1 ■ HTML5: de documentos a aplicativos 63 Figura 1.19 – O jogo 3D Geometry Destroyer em toda a sua glória. A construção desse jogo é abordada no capítulo 9. 1.5 Resumo O HTML5 é a revisão mais importante do HTML desde seu surgimento em 1991. Embora o HTML tenha começado como uma linguagem de marcação relativamente simples, desde então se tornou uma plataforma para tarefas complexas de design de páginas web e desenvolvimento de aplicativos web, principalmente quando associado a seus parentes próximos CSS e JavaScript. O HTML5 é a primeira versão da linguagem a reconhecer essa importância e incluir várias APIs JavaScript orientadas a aplicativos dentro da especificação. No decorrer dos próximos oito capítulos, você aprenderá como construir oito aplicativos diferentes, que vão desde aplicativos móveis que funcionam offline a jogos 3D. No próximo capítulo, deixaremos para trás os conceitos introdutórios e nos aprofundaremos nas vastas melhorias que o HTML5 tem a oferecer aos formulários web, que incluem os novos tipos de entrada que permitem a entrada direcionada de uma variedade muito maior de tipos de dados, novos atributos como autofocus e placeholder, e recursos out-of-the-box que simplificam a validação no lado do cliente.