javascript done right

88
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

Upload: sapo-sessions

Post on 01-Nov-2014

2.926 views

Category:

Technology


0 download

DESCRIPTION

Práticas de JavaScript menos conhecidas. Unobtrusive JavaScript, progressive enhancement vs graceful degradation, HIJAX, incompatibilidades entre browsers e mais.

TRANSCRIPT

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.

Índice

Uso dado ao JavascriptProblemasComo resolvê‐los

Javascript Não ObstrutivoHijaxScripts não bloqueantesHistó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?

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?

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

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/

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

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.com

Page 78: JavaScript done right

SAPO Sessions #2 javascript, done right.

?

Page 79: JavaScript done right

SAPO Sessions #2 javascript, done right.

Scripts não‐bloqueantes

Page 80: JavaScript done right

SAPO Sessions #2 javascript, done right.

scripts não bloqueantes

<head>

<body>

<script>

<script>

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>

<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 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>

Esquecer: document.write

Page 84: JavaScript done right

SAPO Sessions #2 javascript, done right.

Histórico em Webapps

Page 85: 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 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

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

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

Page 87: JavaScript done right

SAPO Sessions #2 javascript, done right.

?

Page 88: 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