89
JAVASCRIPT DONE RIGHT! SAPO Sessions #2 18 Março 2009 André Luís http://andr3.net [email protected] creative commons attribution non-commercial share-alike 3.0

Javascript, Done Right

Embed Size (px)

DESCRIPTION

SAPO Sessions #2 Javascript, done right. Algumas dicas de como resolver alguns dos principais prolemas em usar *tanto* javascript na web hoje em dia.

Citation preview

Page 1: Javascript, Done Right

JAVASCRIPTDONE RIGHT!

SAPO Sessions #218 Março 2009

André Luíshttp://[email protected]

creative commonsattributionnon-commercialshare-alike 3.0

Page 2: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Antes de começar... um disclaimer. :)

Page 3: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Não venho pregar.

Page 4: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Nem vender nada.

Page 5: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Venho‐vos falar da minha experiência.

Page 6: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Desde brincadeiras em javascript no site dum canal de IRC.

2000

Page 7: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Até aplicações web inseridas no Webmail do SAPO.

2009

Page 8: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Programa de Festas

. Uso dado ao Javascript

. Problemas

. Como resolvê‐los. Javascript Não Obstrutivo. Hijax. Scripts não bloqueantes. Histórico com Javascript

2009

Page 9: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript

Tem sido muito maltratado ao longo do tempo

Page 10: Javascript, Done Right

javascriptpopups

SAPO Sessions #2 javascript, done right.

filho do diabo

popupspopupspopups

2001

popups

Em 2001, era o filho do diabo.

Page 11: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

http://whit.me/ajax

2005

Até que...

Page 12: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascripteverybody’s bitch

lover

2005

XMLHttp

Request

WebApps

Mashups

AJAX

Page 13: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript é usado para

Page 14: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript é usado para popups

Page 15: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript é usado para efeitos de estilo

Page 16: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript é usado para decoraçõesnatalícias

Page 17: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript é usado para pré‐carregarimagens

Page 18: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript é usado para mudar de página

Page 19: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript é usado para evitar recarregamentode páginas inteiras

Page 20: Javascript, Done Right

javascript é usado para evitar recarregamentode páginas inteiras

SAPO Sessions #2 javascript, done right.

AJAX

Page 21: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript é usado para tudo

Mapas Validação de Forms

Emuladores de Jogos(spectrum, etc) Office S

uites

Ambientes GráficosApps Offline

Pub/Sub

Page 22: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Será que isto é um problema?

-------25%------

Page 23: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

problemas com o javascriptAusência de suporte para JavascriptIntranets corp., screen-readers, search engine crawlers, NoScript, etc.

Somando as pequenas percentagens destes factores, facilmente se chega acima dos 10%.Mais: um utilizador que veja um site quebrado, muito provavelmente, não volta.

Page 24: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

problemas com o javascriptAusência de suporte para Javascript

Não é bookmarkableNão oferece, de origem, mecanismos para guardar o estado duma webapp

Soa a algo familiar? Argumento muitas vezes usado por *nós* contra sites 100% Flash.

Page 25: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

problemas com o javascriptAusência de suporte para Javascript

Não é bookmarkable

Quebra o histórico (retroceder, avançar)Não oferece, de origem, mecanismos para guardar o histórico

Permite-nos implementar mecanismos para isto, mas não fornece de origem.

Page 26: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

problemas com o javascriptAusência de suporte para Javascript

Não é bookmarkable

Quebra o histórico (retroceder, avançar)

Acessibilidade: navegação por tecladoEventos onmousedown, onmouseover não disparam se não se usar um disp. apontador

focus para além do onmouseover, onclick em vez de onmousedown

Page 27: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

problemas com o javascriptAusência de suporte para Javascript

Não é bookmarkable

Quebra o histórico (retroceder, avançar)

Acessibilidade: navegação por teclado

Usabilidade: controlar a abertura dum linkAbrir numa nova tab, nova janela ou enviar link por mail. Problema: href=”#”

Page 28: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

problemas com o javascriptAusência de suporte para Javascript

Não é bookmarkable

Quebra o histórico (retroceder, avançar)

Acessibilidade: navegação por teclado

Usabilidade: controlar a abertura dum link

Boas notícias: tudo isto é evitável.

Page 29: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Graceful Degradation Progressive EnhancementDegradação Graciosa vs. Melhoramento Progressivo

Page 30: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Mostram‐se versões alternativas no caso do cliente não suportar todas as tecnologias utilizadas. 

Graceful Degradation Progressive EnhancementDegradação Graciosa vs. Melhoramento Progressivo

Page 31: Javascript, Done Right

Mostram‐se versões alternativas no caso do cliente não suportar todas as tecnologias utilizadas. 

SAPO Sessions #2 javascript, done right.

Exemplos:<img src=”foto.png” alt=”Fotografia”><noscript><noframes>

Graceful Degradation Progressive EnhancementDegradação Graciosa vs. Melhoramento Progressivo

Page 32: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Constrói‐se uma versão base/usável duma 

funcionalidade e melhora‐se progressivamente.

Graceful Degradation Progressive EnhancementDegradação Graciosa vs. Melhoramento Progressivo

Page 33: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Constrói‐se uma versão base/usável duma 

funcionalidade e melhora‐se progressivamente.

Exemplos:Substitução de Imagens por CSS

Javascript Não Obstrutivo

Graceful Degradation Progressive EnhancementDegradação Graciosa vs. Melhoramento Progressivo

Page 34: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Constrói‐se uma versão base/usável duma 

funcionalidade e melhora‐se progressivamente.

Exemplos:Substitução de Imagens por CSS

Javascript Não Obstrutivo

Graceful Degradation Progressive EnhancementDegradação Graciosa vs. Melhoramento Progressivo

Melhorar progressivamente!

Page 35: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

?

Page 36: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Page 37: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

obstrutivo: adj.que causa obstrução;que serve para obstruir.

Funny story: não foi possível colocar o link directo para “obstrutivo” pq a priberam usa JS obstrutivo.

Page 38: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

obstrutivo: adj.que causa obstrução;que serve para obstruir.

fonte: Priberam http://priberam.pt/dlpo/

FAILFunny story: não foi possível colocar o link directo para “obstrutivo” pq a priberam usa JS obstrutivo.

Page 39: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Mas como?

Page 40: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Revisão da matéria dada: Camadas de Separação

ConteúdoHTML

ComportamentoJAVASCRIPT

ApresentaçãoCSS

Page 41: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

ConteúdoHTML

ComportamentoJAVASCRIPT

ApresentaçãoCSS

/whatever.php

/css/style.css /js/whatever.js

Revisão da matéria dada: Camadas de Separação

Page 42: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

ConteúdoHTML

ComportamentoJAVASCRIPT

ApresentaçãoCSS

/whatever.php

/css/style.css /js/whatever.js

Revisão da matéria dada: Camadas de Separação

Não misturar tecnologias.

Loose coupling FTW!!

Page 43: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Revisão da matéria dada: Carregamento e Eventos

HTML

JAVASCRIPTCSSonDomReady / domContentLoaded

MEDIAwindow.onLoad

DOMContentLoaded no HTML5

Page 44: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Quão importante é um mero link?

-------50%------

Page 45: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Vannevar Bush

1945: propôs o Memex, um computador teórico que em vez de ordenar informação alfabeticamente, usava associações entre documentos. Inspirou a criação do conceito de hipertexto. Artigo: As We May Think.

Page 46: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Ted Nelson

1960: Fundou projecto Xanadu, definiu o conceito de Hipertexto. Apesar do seu conceito ser um pouco mais completo, xanadu falhou. (links que se quebram nem gestão de versões, na WWW do TBL)

Page 47: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Douglas Engelbart

1963: NLS (oNLine System), que utilizava ligações (links) do conceito do hipertexto.

Page 48: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Tim Berners‐Lee

tanaka

1991: WWW, num lab do CERN.

Page 49: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

<a href=”javascript:show( ‘wonderbra.png’, ...

FAIL

Link sem href = big no no.Motores de busca não seguem.Não há JS, não há link. Não tem de ser assim...

Page 50: Javascript, Done Right

<a href=”#” onclick=”show( ‘wonderbra.png’, ...

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

FAILAinda assim...

Está a definir um handler por Javascript... mas não tem href.AVISO: Sempre que escreverem “#”. YOU’RE DOIN’ IT WRONG!

Page 51: Javascript, Done Right

<a href=”#” onclick=”show( ‘wonderbra.png’, ...

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

FAILAinda assim...

I CAN HAZ CHEEZBURGERhttp://whit.me/doinitwrong

Está a definir um handler por Javascript... mas não tem href.AVISO: Sempre que escreverem “#”. YOU’RE DOIN’ IT WRONG!

Page 52: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

menos mau

<a href=”wonderbra.png”onclick=”show(‘wonderbra.png’);return false;”>...

Já tem href. ATENÇÃO: return false; impede o browser de seguir o href=Mas... javascript inline é má idea.

Page 53: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

<a href=”wonderbra.png”onclick=”show(this.href);return false;”>...

menos mau

DRY - don’t repeat yourself. ;)

Page 54: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

melhor

<a href=”wonderbra.png”class=”preview”>...

Page 55: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

var prevs = document.getElementsByClassName(‘preview’);

for (var i=0,len=prevs.length;i<len;i++) {prevs[i].addEventListener (‘click’, show);prevs[i].onclick = ‘return false’;

}

meanwhile...in a js file not far from there

Page 56: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

var prevs = document.getElementsByClassName(‘preview’);

for (var i=0,len=prevs.length;i<len;i++) {prevs[i].addEventListener (‘click’, show);prevs[i].onclick = ‘return false’;

}

meanwhile...in a js file not far from there

In your dreams, sucker!

Page 57: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

Frameworks ajudam a lidar com as incoerências dos browsers

Page 58: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

jQuery (document).ready ( function () {jQuery('a.jquery').click (function () {

alert('jQuery!');return false;

} );} );

jQuery

Page 59: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

document.observe ( 'dom:loaded', function () {$$('a.prototype').each (function (el) {

Event.observe (el, 'click', function () {alert('Prototype!');

});el.setAttribute( 'onclick', 'return false;');

}); });

Prototype.js

Page 60: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

document.observe ( 'dom:loaded', function () {$$('a.prototype').each (function (el) {

Event.observe (el, 'click', function (ev) {alert('Prototype!');

});Event.stop(ev);

}); });

Prototype.js

Page 61: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Remover obstruções

demo

Demo #1 @ http://workshop.andr3.net/saposessions/

Page 62: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Exemplo Lightbox http://www.lokeshdhakar.com/projects/lightbox2/

Fonte das imagens: http://brunoluis.com

Page 63: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

1 Links para as imagens: href=”wonderbra.jpg”

Exemplo Lightbox

2 on dom:loaded, procurar links com rel=”lightbox”

3 Definir funções para mostrar o Loading... e carregar imagem dentro da página

4 Cancelar a acção de “click” para o browser não seguir o que está no href.

Page 64: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

1 <a href=”wonderbra.jpg” rel=”lightbox”>

Exemplo Lightbox

2 a[rel=lightbox] todos os links com atributo rel=lightbox

3 addEventListener (w3c) / attachEvent (IE)

4 return false;

Page 65: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

E formulários?

Page 66: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

http://web.mail.sapo.pt/

-------75%------

Page 67: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Page 68: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

onSubmit

DOM LOADED!

Page 69: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

onSubmit

DOM LOADED!

Page 70: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

demo

Demo #2 @ http://workshop.andr3.net/saposessions/

Page 71: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Mais aplicações:

Ecrãs de registo, transformar link “Termos e condições” num overlay.

Reconhecer microformatos e inserir links para as transformações.

Page 72: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

AJAX

Page 73: Javascript, Done Right

AJAX

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

KAPOW!

Page 74: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

HIJAX

1 Construir um site que utilize links e formulários tradicionais. Sem recurso a javascript.

2 Entrar no DOM, definir eventListeners para os eventos certos e substituir os carregamentos de páginas completas por pequenos pedidos AJAX.

by Jeremy Keith

Page 75: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

1 Planear para o AJAX desde as wireframes.

2 Implementá‐lo no final.

by Jeremy KeithHIJAX

Page 76: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

Mais info, no blog DomScripting.org

http://whit.me/hijax

by Jeremy KeithHIJAX

Page 77: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

http://unobtrusify.comJeremy Keith: Behavioral Separation

Page 78: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

javascript não obstrutivo

1. Começar com o conteúdo

2. Dar­lhe estrutura com html semântico

3. Aplicar css

4. Aplicar comportamento com JS

http://whit.me/behavsepBehavioral Separation, by Jeremy Keith

A LIST APART.

Page 79: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

?

Page 80: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Scripts não‐bloqueantes

Page 81: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

scripts não bloqueantes

<head>

<body>

<script>

<script>

Page 82: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

scripts não bloqueantes

<head>

<body>

<script><script>

Page 83: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

scripts não bloqueantes

<head>

<body>

<script><script>

<script type=”text/javascript”>(function () {

var scr = document.createElement(‘script’);scr.type = ‘text/javascript’;scr.src = ‘ficheiro_de_js_nao_obstrutivo.js”;var cabeca = document.getElementsByTagName(‘head’)[0];cabeca.appendChild(scr);

)( );</script>

Função Anónima, auto-executável e limpa. (nada no scope global)

Page 84: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

scripts não bloqueantes

<head>

<body>

<script><script>

<script type=”text/javascript”>(function () {

var scr = document.createElement(‘script’);scr.type = ‘text/javascript’;scr.src = ‘ficheiro_de_js_nao_obstrutivo.js”;var cabeca = document.getElementsByTagName(‘head’)[0];cabeca.appendChild(scr);

)( );</script>

Esquecer: document.write

Page 85: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Histórico em Webapps

Page 86: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Quebra o histórico (retroceder, avançar)Não oferece, de origem, mecanismos para guardar o histórico

Histórico em Webapps

1 Alterar o location.href.hash

2 Verificar se o location.href.hash mudou e lidar com essa mudança

Page 87: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

Quebra o histórico (retroceder, avançar)Não oferece, de origem, mecanismos para guardar o histórico

Histórico em Webapps

1 Alterar o location.href.hash

2 Verificar se o location.href.hash mudou e lidar com essa mudança

http://developer.yahoo.com/yui/history/

3 Inconsistências de browsers *cof*IE*cof*

IE = usar uma iframe, ir alterando a SRC.

Page 88: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

?

Page 89: Javascript, Done Right

SAPO Sessions #2 javascript, done right.

That’s all folks!

http://domscripting.orghttp://www.alistapart.com/topics/code/scripting/http://talks.andr3.net/2009/js,doneright.pdfhttp://slideshare.net/andr3

creative commonsattribution

non-commercialshare-alike 3.0

André Luí[email protected]@andr3.net