Skip to content

Posts tagged ‘JavaScript’

9
Fev

como escrever um código javascript limpo e bonito

Nicholas Zakas é um engen­heiro na equipa da YUI
28
Jan

Ajax File Browser System

Com o AJAX File Browser con­seguimos lis­tar todas as sub-pastas e ficheiros de um disco e ainda abrir alguns ficheiros .doc .xls  .ppt caso tenha o MS OFFICE instalado.

Com um visual e fun­ciona­mento muito pare­cido ao explorer do Win­dows Vista e per­mite ainda o upload de ficheiros para o servidor.

Corre nos seguintes browsers:

  • Inter­net Explorer 7
  • Mozilla Fire­fox 2 or later
  • Safari 3.0.4 or later
  • Google Chrome 0.3.154.9 or later
  • Netscape Nav­i­ga­tor 9 or later

Pode encon­trar out­ras APIs como map drive em http://www.webdavsystem.com

22
Jan

How global is your JavaScript?

Mats Bryntse “had an idea about check­ing the most pop­u­lar javascript frame­works & APIs to see how they dif­fer in terms of global name­space pol­lu­tion. This page loads all the frame­works sep­a­rately in an iframe and com­pares the win­dow object against the one of a fresh iframe. I also included infor­ma­tion about which builtin JavaScript classes have been aug­mented, not sure how that would be use­ful but it shows a dif­fer­ence in archi­tec­tural approach between the frame­works. You can click a row to see the details about the global sym­bols in the framework/API.

The results vary more than I’d expected and it’s inter­est­ing to see the dif­fer­ent name­spacing strate­gies at play. YUI/Jquery/Ext keep the num­bers down by putting every­thing in one global object. It seems like Microsoft is using their own kind of name­spacing using the $ sign as a name­space delim­iter rather than using real object prop­er­ties as the rest of the frame­works do.”

You can check this out via his checker page. An inter­est­ing read and you can nar­row in on APIs of your choice.

We like to talk about how evil global vari­ables are, but I won­der if we take this a touch too seri­ously some­times. Sure there can be col­li­sions and the like, but a lot of projects are doing just fine :)

via : ajaxian.com

20
Jan

Como optimizar o seu Javascript e comprimir o css para loads mais rápidos

O packed.it Web 2.0 é um serviço on-line capaz de opti­mizar e mel­ho­rar a nave­g­ação na web. É sim­ples, rápido e fácil de personalizar.

Packed.it é a solução para a Web 2.0, é com­patível com a maio­ria dos browsers e com as mel­hores práti­cas em ter­mos de acessibilidade.

artigo com­pleto em :

http://www.maxkiesler.com/index.php/weblog/comments/how_to_minimize_your_javascript_and_css_files_for_faster_page_loads/

http://www.packed.it/

7
Jan

Javascript: Regular Expression

Neste artigo eu vou usar tanto a palavra expressões reg­u­lares como Reg­u­lar Expres­sion (inglês). Eu vou usar em por­tuguês para facil­i­tar, mas esse nome não existe em português.

As expressões reg­u­lares são padrões uti­liza­dos para encon­trar com­bi­nações de car­ac­teres em Strings. É uma fer­ra­menta muito poderosa porque con­segue resumi em algu­mas lin­has de código pesquisas alta­mente com­plexas. O prin­ci­pal uso de expressões reg­u­lares em Javascript seria na val­i­dação de dados.

Em JavaScript, expressões reg­u­lares tam­bém podem ser tratadas como um objeto. Esses padrões são usa­dos com os méto­dos exec e test do objeto Reg­Exp, e com os méto­dos match, replace, search, e split do objeto String.

Algu­mas das traduções deste artigo não são total­mente fieis. Espero que con­sigam enten­der o que a men­sagem está passando.

Enten­dendo as Expressões Regulares

As expressões reg­u­lares podem ser cri­adas de duas formas:

- Escrevendo uma expressão regular:

seek = /padrao/

padrao é a string padrão para ser usada na pesquisa.

- Criando uma instan­cia do objeto RegExp:

seek = new RegExp(“padrao”);

padrao é a string padrão para ser usada na pesquisa.

Reg­u­lar Expres­sion é um padrão de texto que con­siste de sim­ples car­ac­teres (da letra a até z, ou de 1 até 9) e de uma com­bi­nação de car­ac­teres sim­ples e especiais.

Os padrões para a pesquisa de car­ac­teres estão divi­di­dos em cat­e­go­rias. Segue abaixo uma lista dos gru­pos e respec­tivos car­ac­teres especiais.

Busca posi­cionada

Sím­bolo

Descrição

Exem­plo

^

Busca somente no iní­cio da string

/^The/ encon­tra “The” em “The night” mas não em “In The Night”

$

Busca somente no fim da string

/and$/ encon­tra “and” em “Land” mas não em “landing”

\b

Encon­tra em qual­quer parte da string

/ly\b/ encon­tra “ly” em “This is really cool.”

\B

Encon­tra qual­quer parte que não esteja limitada

/\Bor/ encon­tra “or” em “nor­mal” mas não em “origami.”

Lit­erais

Sím­bolo

Descrição

Alfanu­mer­ica

Todos os car­ac­teres alfabéti­cos e numerais se encon­tram lit­eral­mente. Então /2 dias/ encon­trarão “2 days” den­tro da string

\n

Encon­tra o car­ac­tere de nova linha

\f

Encon­tra o car­ac­tere de nova página

\r

Encon­tra o car­ac­tere de retorno de carro

\t

Encon­tra o car­ac­tere de tab­u­lação horizontal

\v

Encon­tra o car­ac­tere de tab­u­lação vertical

\xxx

Encon­tra o car­ac­tere ASCII expresso por um número octal xxx.
“\50″ encon­tra o car­ac­tere parên­te­ses esquerdo “(“

\xdd

Encon­tra o car­ac­tere ASCII expresso por um número hexa­dec­i­mal dd.
“\x28″ encon­tra o car­ac­tere parên­te­ses esquerdo “(“

\uxxxx

Encon­tra o car­ac­tere ASCII expresso por UNICODE xxxx.
“\u00A3″ encontra “£”.

A barra inver­tida (\) é tam­bém usada quando você deseja encon­trar um car­ac­tere espe­cial lit­eral­mente. Por Exem­plo, se você deseja encon­trar o sím­bolo “$” ao invés de ter um sinal no final da string, use a barra invertida: /\$/

Classes de Caracteres

Sím­bolo

Descrição

Exem­plo

[xyz]

Encon­tra qual­quer car­ac­tere que estiver den­tro do grupo. Você pode usar hífen para deno­tar escala. Por Exem­plo. /[a-z]/ encon­tra qual­quer letra do alfa­beto alpha­bet, /[0–9]/ encon­tra qual­quer dígito

/[AN]BC/ encon­tra “ABC” e “NBC” mas nao “BBC” desde que a letra “B” nao estao nogrupo.

[^xyz]

Encon­tra qual­quer car­ac­tere que não estiver den­tro do grupo. O cir­cun­flexo indica que nen­huma car­ac­tere deve estar na string.
NOTA: O cir­cun­flexo usado den­tro da classe de car­ac­tere é difer­ente do que denota o iní­cio da string, não se con­fun­dam. A negação aqui só é per­mi­tida den­tro dos sinais

/[^AN]BC/ encon­tra “BBC” mas nao “ABC” ou “NBC”.

.

(Ponto). Encon­tra qual­quer car­ac­tere exceto o car­ac­tere de nova linha ou ter­mi­nador de linha Unicode

/b.t/ encon­tra “bat”, “bit”, “bet” e assim por diante

\w

Enconta qual­quer car­ac­tere alfanumérico incluindo under­score. Equiv­a­lente a [a-zA-Z0-9_]

/\w/ encon­tra “200″ em “200%”

\W

Encon­tra qual­quer car­ac­tere que não se encon­tra na classe dos alfanuméri­cos. Equiv­a­lente a [^a-zA-Z0-9_]

/\W/ encon­tra “%” em “200%”

\d

Encon­tra qual­quer dígito. Equiv­a­lente a [0–9]

\D

Encon­tra qual­quer car­ac­tere que não seja um dig­ito. Equiv­a­lente a [^0–9]

/\D/ matches “No” in “No 342222″

\s

Encon­tra qual­quer car­ac­tere que equiv­ale a um espaço. Equiv­a­lente a [ \t\r\n\v\f]

\S

Encon­tra qual­quer car­ac­tere que não equiv­ale a um espaço. Equiv­a­lent to [^ \t\r\n\v\f]

Repetição

Sím­bolo

Descrição

Exem­plo

{x}

Encon­tra exata­mente x ocor­rên­cias na reg­u­lar expression

/\d{5}/ encon­tra 5 digitos

{x,}

Encon­tra x ou mais ocor­rên­cias na reg­u­lar expression

/\s{2,}/ encon­tra no min­imo 2 car­ac­teres de espaço em branco

{x,y}

Encon­tra x para y numero de ocor­rên­cias na reg­u­lar expression

/\d{2,4}/ encon­tra no min­imo 2 mas nao mais que 4 digitos

?

Encon­tra zero ou nen­huma ocor­rên­cia. Equiv­a­lente a {0,1}

/a\s?b/ encon­tra “ab” ou “a b”.

*

Encon­tra zero ou mais ocor­rên­cias. Equiv­a­lente a {0,}

/we*/ encon­tra “w” em “why” e “wee” em “between”, mas nao em “bad”

+

Encon­tra uma ou mais ocor­rên­cias. Equiv­a­lente a {1,}

/fe+d/ encon­tra tanto em “fed” quanto em “feed”

Alter­nação & Agrupamento

Sím­bolo

Descrição

Exem­plo

( )

Agru­pa­mento de car­ac­teres para criar uma cláusula de condição. Pode estar aninhado

/(abc)+(def)/ encon­tra um ou mais ocor­ren­cias de “abc” seguido por uma ocor­ren­cia de “def”

|

Com­bina cláusu­las de condições den­tro de uma reg­u­lar expres­sion e então encon­tra qual­quer uma das cláusu­las. Sim­i­lar à expressão “OR

/(ab)|(cd)|(ef)/ encon­tra “ab” ou “cd” ou “ef”.

Back­ref­er­ences

Sím­bolo

Descrição

Exem­plo

( )\n

Encon­tra uma cláusula entre parên­te­ses. n é o número de cláusu­las para a esquerda da backreference

(\w+)\s+\1 encon­tra quais­quer palavras que ocorra duas vezes na mesma linha, como “hubba hubba.” O \1 denota que a prime­ria palavra depois do espaço deve encon­trar a porção da string que foi encon­trada no último com­mando den­tro de parên­te­ses. Se exis­tisse mais de um comando den­tro de parên­te­ses, você deve usar \2 ou \3 para encon­trar o apro­pri­ado agru­pa­mento da esquerda da back­ref­er­ence. Até 9 back­ref­er­ences podem ser usadas no padrão da string

Mod­i­fi­cadores de Padrões

Em adição aos car­ac­teres padrões para bus­car, você pode usar switches para fazer uma pesquisa global, case– insen­si­tive (ignora minús­cu­las e maiús­cu­las) ou ambas.

Pro­priedade

Descrição

Exem­plo

i

Ignora se é minús­cula ou maiúscula

/The/i encon­tra “the” e “The” e “tHe”

g

Pesquisa Global para todas as ocor­rên­cias do padrão

/ain/g encon­tra os dois “ain” em “No pain no gain”, ao inves de ape­nas o primeiro

gi

Pesquisa Global, e igno­rar caso

/it/gi encon­tra todos “it” em “It is our IT depart­ment”
lastIndex

lastIn­dex

Armazena a posição da última pesquisa bem suces­sida real­izada na string. Se nada for encon­trado, a pro­priedade lastIn­dex será colo­cada como –1

$n

n rep­re­senta o numero de 1 a 9
Armazena os nove mais recentes pesquisa den­tro de parên­te­ses encon­tradas. Por exem­plo, se o padrão usado por uma reg­u­lar expres­sion para a última pesquisa foi /(Hello)(\s+)(world)/ e a string pesquisada foi “Hello world” o con­teúdo de RegExp.$2 pode­ria ser qual­quer car­ac­tere entro “Hello” e “world”

source

Armazena a copia do padrão da reg­u­lar expression

Enten­dendo os méto­dos usa­dos pelas expressões regulares

Método

Descrição

exec

Um método Reg­Exp que exe­cuta pesquisas em uma string. O mesmo retorna um array das infor­mações obtidas

test

Um método Reg­Exp que testa uma pesquisa em uma string. O mesmo retorna true ou false

match

Um método de String que exe­cuta uma pesquisa em uma string. O mesmo retorna um array das infor­mações obti­das ou nulo se nada for encontrado

search

Um método de String que testa uma pesquisa em uma string. O mesmo retorna o índice do resul­tado, ou –1 se a pesquisa falir

replace

Um método de String que exe­cuta uma pesquisa em uma string, e sub­sti­tui o resul­tado encon­trado por uma substring

split

Um método de String que usa uma reg­u­lar expres­sion ou uma string para que­brar uma string em uma array de substrings

Quando você quer saber se o padrão foi encon­trado na string, use o método test ou search; para maiores infor­mações (mas com exe­cução mais lenta) use o método exec ou match. Se você usar exec ou match e se obter sucesso, esses méto­dos retornaram um array e atu­alizaram as pro­priedades do objeto reg­u­lar expres­sion asso­ci­ado e tam­bém de obje­tos pré-definidos, Reg­Exp. Se a pesquisa falir, o método exec retornará nulo (no qual con­vert­erá para false).

Pro­gra­mando Expressões Regulares

A par­tir do momento que sabe­mos quais car­ac­ters dese­jamos deve­mos par­tir para a cri­ação do padrão que sera uti­lizado para pesquisar a String.

Vamos, a par­tir de agora, criar alguns exem­p­los práti­cos de como uti­lizar Expressões Regulares.

No nosso primeiro exem­plo vamos pesquisar na string um padrão que é com­posto da palavra “de”. O O resul­tado obtido nos mostrará onde se encon­tra a primeira e a ultima ocor­rên­cia das pesquisas.

Exem­plo:

1 <SCRIPT LANGUAGE=”JavaScript”>
2 padrao=/de/g;
3 // padrao = new RegExp(“de”,”g”);
4 texto = “Brasil ganha a medalha de ouro no volei de praia.”;
5 doc­u­ment.write(“<b>padrao » </b>” + padrao + “<br>”);
6 doc­u­ment.write(“<b>Texto uti­lizado » </b>” + texto + “<br>”);
7 doc­u­ment.write(“O padrao uti­lizado foi encon­trado no <b>” + texto.search(padrao) + “º </b>caractere.<br>”)
8 padrao.exec(texto);
9 doc­u­ment.write(“O ultimo valor encon­trado e” o caractere<b> ” + padrao.lastIndex + “º </b>.”);
10 </SCRIPT>

Linha 2 – Declar­ação da var­iável padrão com a seqüên­cia de car­ac­teres a serem uti­liza­dos nas pesquisas.

Linha 3 – Tem o mesmo fun­ciona­mento da linha 2, porém vai criar uma instân­cia do objeto Reg­Exp com a seqüên­cia de caracteres.

Linha 7 – Uti­liza­ção do método search() para encon­trar o padrao na var­iável texto.

Linha 8 – Uti­liza­ção do método exec para pesquisar a seqüên­cia padrão na var­iável texto.

Linha 9 – Uti­liza­ção da pro­priedade lastIn­dex para retornar a última vez que a seqüên­cia de car­ac­teres foi encon­trada na var­iável texto.

Clique aqui para ver o exem­plo 01.

Exem­plo 02

Este exem­plo é um pouco mais com­plexo. Ele val­ida a entrada de dados por parte do usuário. O usuário vai dig­i­tar um número de tele­fone como pro­posto no exemplo.

1 <SCRIPT LANGUAGE = “JavaScript”>
2 padrao = /\(?\d{3}\)?\d{3}-\d{4}/;
3 func­tion testInfo(x) {
4 a = x.Phone.value;
5 OK = padrao.exec(a);
6 if (!OK){
7 window.alert (“Este numero de tele­fone esta incor­reto!”);
8 x.Phone.focus();
9 } else {
10 window.alert (“Obri­gado, seu numero de tele­fone e” » ” + OK[0]);
11 }
12 }
13 </SCRIPT>

Linha 2 – Declar­ação da var­iável padrao com a seqüên­cia de car­ac­teres a serem uti­liza­dos nas pesquisas.

Linha 3 – Declar­ação da função testInfo() que recebe um parâmetro com o objeto form a ser utilizado

Linha 4 – Declar­ação da var­iável a que armazena o valor do parâ­men­tro x (o for­mulário) seguido do nome do campo e respec­tivo valor

Linha 5 – Declar­ação da var­iável OK que recebe o valor da ver­i­fi­cação se o padrão re está con­tido na var­iável a

Linha 6 a 11 – Ver­i­fi­cação da negação da var­iável OK. Se retornar true, uma caixa de men­sagem será mostrada com uma men­sagem de erro e o campo em questão rece­berá o foco. Se retornar false uma caixa de men­sagem será mostrada com uma men­sagem e o número do telefone.

Com todo o código Javascript cri­ado, vamos à cri­ação do código HTML.

1 Dig­ite um número de tele­fone, como por exem­plo » (201)465‑7899.
2 <FORM onSubmit=”return false;”>
3 <INPUT TYPE=”text” NAME=”Phone” onChange=”testInfo(this.form);”>
4 <input type=”button” value=”valida” onClick=”testInfo(this.form);”>
5 </FORM>

Linha 2 – O evento onSub­mit retorna false para o for­mulário não seja enviado.

Linha 3 – O evento onChange da caixa de texto chama a função testInfo() e envia como parâmetro o objeto form.

Linha 4 – O evento onClick do botão chama a função testInfo() e envia como parâmetro o objeto form.

Clique aqui para ver o exem­plo 02.

Exem­plo 03

Neste exem­plo vamos tra­bal­har com mais méto­dos e enten­der onde podemos chegar com ape­nas algu­mas lin­has de código. Aqui nos dividi­mos uma string, colo­camos seu resul­tado em uma matriz e ainda orde­n­amos a mesma.

1 <SCRIPT LANGUAGE=”JavaScript1.2″>
2 nomes = new String (“Thi­ago Prado ; Bill Gates ; Steve Jobs; Michael Dell ; Chris Hand “);
3 doc­u­ment.write (“<b>String Original</b>” + “<br>” + “<br>”);
4 doc­u­ment.write (nomes + “<br>” + “<br>”);
5 padrao = /\s*;\s*/;
6 lis­taNomes = nomes.split (padrao);
7
8 padrao = /(\w+)\s+(\w+)/;
9 noval­is­taNomes = new Array;
10 doc­u­ment.write (“<b>Apos ter sido divi­dido pela Expres­sao Reg­u­lar </b>” + “<br><br>”);
11 for ( i = 0; i < listaNomes.length; i++) {
12 doc­u­ment.write (listaNomes[i] + “<br>”);
13 novalistaNomes[i] = listaNomes[i].replace (padrao, “$2, $1″)
14 }
15 doc­u­ment.write (“<br><b>Nomes revertidos</b>” + “<br><br>”);
16 for ( i = 0; i < novalistaNomes.length; i++) {
17 doc­u­ment.write (novalistaNomes[i] + “<br>”)
18 }
19 novalistaNomes.sort();
20 doc­u­ment.write (“<br> <b>Ordenados</b>” + “<br><br>”);
21 for ( i = 0; i < novalistaNomes.length; i++) {
22 doc­u­ment.write (novalistaNomes[i] + “<br>”)
23 }
24 </SCRIPT>

Linha 2 – Declar­ação da var­iável nomes com alguns nomes a serem uti­liza­dos no código

Linha 3 a 4 – Mostra na tela a var­iável nomes sem nen­huma alteração

Linha 5 – Declar­ação da var­iável padrao com a seqüên­cia de car­ac­teres a serem uti­liza­dos nas pesquisas.

Linha 6 – Cri­ação da matriz lis­taNomes com a divisão da string nomes a par­tir do padrão utilizado.

Linha 8 – A var­iável padrão recebe nova seqüên­cia de car­ac­teres a serem uti­liza­dos nas pesquisas.

Linha 10 a 14 – Mostra na tela a lista de Nomes depois da divisão

Linha 13 – A matriz novalistaNomes(indexada da var­iável do loop) recebe o valor da matriz lis­taNomes (index­ada da var­iável do loop) que uti­liza o método replace para tro­car o primeiro nome pelo segundo. Isso é pos­sível por causa do uso da expressão regular.

Linha 15 a 18 – Mostra na tela a lista de Nomes revertidos

Linha 19 – Uti­liza­ção do método sort para ordernar a matriz novalistaNomes

Linha 20 a 23 – Mostra na tela a lista de Nomes Ordenados

Clique aqui para ver o exem­plo 03.

Reg­u­lar Expres­sion é um assunto muito amplo, e não é pos­sível abordá-lo em ape­nas alguns exem­p­los. Mas para o futuro eu vou preparar uma outra matéria com códi­gos mais poderosos para mostrar o que real­mente quero dizer com “resumi em algu­mas lin­has de código pesquisas alta­mente complexas”.

Fonte: Thi­ago Prado

16
Dez

Bibliotecas JavaScript

Mochikit

Mochikit

O Mochikit é o filho caçula de Bob Ippolito (o par­tic­i­pante prin­ci­pal) e está disponível no site do Mochikit. O pacote prin­ci­pal tem aprox­i­mada­mente 90 Kb (com­pactado), mas você pode carregá-lo em módu­los sep­a­ra­dos. A bib­lioteca tam­bém é dis­tribuída com a ver­são do frame­work do Python para web, chamada de Tur­bo­Gears.

Nas palavras do Bob:

Nós anal­isamos todas as idéias que poderíamos encon­trar apartir da nossa exper­iên­cia com Python e foram adap­tadas ao mundo louco do JavaScript”

Assim, em uma visão macro, o Mochikit extrai algu­mas fun­cional­i­dades do Python para sua API. Se você é famil­iar com o Python, você terá um apren­dizado ime­di­ato com o Mochikit, emb­ora tenha uma API sim­ples que seja razoavel­mente fácil de uti­lizar. De todas as bib­liote­cas ressaltadas neste artigo, a API do Mochikit trans­mite ser a mais “preparada”.

Quando estiver começando com o Mochikit, você precisará:

  1. Assi­s­tir ao screen­cast do Bob.
  2. Começar uti­lizando o inter­pre­ta­dor inter­a­tivo exce­lente do Mochikit. Esta é uma boa maneira de enten­der a bib­lioteca e ter uma com­preen­são básica de como Mochikit trabalha.

O básico sobre Mochikit

Ao tra­bal­har com o DOM, o Mochikit traz alguns truques na luva:

var warning = P(
 { 'class' : 'warning' },
 "Por favor insira um ", STRONG(null, "endereço de e-mail válido")
);
swapDOM(document.getElementById("notificacoes"), warning);

Este código usará os méto­dos W3C DOM rel­e­vantes para os nós da árvore equiv­a­lentes ao código HTML seguinte:

<p class="warning">Please provide a <strong>valid email address</strong></p>

O código do Mochikit está quase mais limpo do que a sin­taxe do HTML!

O módulo do Mochikit.DOM con­tem tam­bém out­ros méto­dos para a manip­u­lação fácil do DOM, tal como o método do swap­DOM men­cionado acima e toHTML (que con­verte um nó de DOM ao HTML que representa).

Assim como na manip­u­lação de even­tos, o Mochikit foi pro­je­tado para que seja imple­men­tado no módulo de Mochikit.Signal. Foi baseado em torno do con­ceito de conec­tar um ouvinte a um sinal que fosse emi­tido por um objeto. Todos os even­tos reg­u­lares do DOM são sinais, mas você pode criar seus próprios tam­bém. O método conec­tar faz todo o tra­balho aqui:

// conecta o sinal do onclick no elemento com id="thing"
// para a função showDialog, com pontos para este elemento.
connect($('thing'), 'onclick', showDialog);

// conecta o sinal do onsubmit para o elemento id="form" para
// o formController.checkSubmit, com pontos para o objeto formController.
connect($('form'), 'onsubmit', formController, 'checkSubmit');

Você pode fazer seus próprios obje­tos enviar sinais com o método do sinal:

signal(anObject, 'a_signal');

O mate­r­ial de AJAX é segu­rado pelo módulo Mochit.Async, e pelos obje­tos aux­il­iares que se encon­tram no núcleo de sua imple­men­tação. Para exe­cu­tar uma chamada básica de AJAX, use o load­J­SON­Doc ou doSim­pleXML­HttpRe­quest:

var request = doSimpleXMLHttpRequest('opcoes.php',
   { q : 'desenvolvedor web'}
);

Esta função retorna um objeto aux­il­iar, em que você pode fazer novas chamadas:

request.addCallbacks(mySuccessFunction, myErrorFunction);

Quando o XML­HttpRe­quest se exe­cuta, a função pas­sada na chamada acima (mySuc­cess­Func­tion) passa o objeto do XML­HttpRe­quest como o argumento:

function mySuccessFunction(req) {
 alert(req.responseText);
}

Os obje­tos aux­il­iares são úteis para a pro­gra­mação assín­crona e são uma grande idéia. Leia mais sobre o assunto, ou veja o screen­cast para mais detalhes.

Prós e contras

Primeira­mente, a estru­tura de log do Mochikit é exce­lente. Adi­cionar indi­cações sim­ples­mente utilizando:

log("Bem melhor que o alert");
log("ERRO Esta coisa está quebrada");

O Mochikit faz uso tam­bém de car­ac­terís­ti­cas da pro­gra­mação fun­cional do Javascript para realçar e sim­pli­ficar sua bib­lioteca API. Por exem­plo, se você quiser clas­si­ficar um grupo dos obje­tos por seus nomes de pro­priedades, você pode usar o key­Compara­tor criar a função de clas­si­fi­cação para você:

var sortedByName = people.sort(keyComparator("name"));

Há tam­bém a função counter. Ela cria uma função que retorna um valor que seja incre­men­tado toda vez que for chamada:

var nextId = counter();
nextId(); //=> 1
nextId(); //=> 2
nextId(); //=> 3

Há tam­bém várias funções de iter­ação do estilo-Python, tais como forE­ach, map e fil­ter.

Quanto a doc­u­men­tação, o Mochikit tem uma doc­u­men­tação boa da API, mas os detal­hes em algu­mas partes muito bási­cas da bib­lioteca deixam a dese­jar. No detalhe, após ter lido toda a doc­u­men­tação, ter prestado atenção no screen­cast e ter escrito alguns scripts Mochikit, ainda sou incerto sobre qual a mel­hor ver­são da bib­lioteca para toda final­i­dade. Eu uso a ver­são com­pactada ou o Mochikit.js prin­ci­pal? Como posso car­regar as partes indi­vid­u­ais da biblioteca?

Entre­tanto, Mochikit tem uma lista de dis­cussão que responde a estes tipos de perguntas.

Yahoo! UI

Yahoo! UI Library

A bib­lioteca Yahoo! UI (YUI, como é apel­i­dada) foi desen­volvida pelo Yahoo! para o uso interno, mas teve seu código aberto recen­te­mente junto com uma gama de recur­sos exce­lentes para desen­volve­dores em developer.yahoo.com.

O YUI é mais uma coleção dis­tinta de “util­i­dades” do que uma bib­lioteca (como as que foram tratadas aqui), com cinco scripts prin­ci­pais que tratam de:

  • ani­mação
  • AJAX
  • manip­u­lação DOM
  • drag-and-drop
  • trata­mento de eventos

E há seis con­troles, chama­dos de:

  • Cal­en­dar
  • Slider
  • Menu
  • Auto­Com­plete
  • Tree View
  • Con­tainer classes (com o qual você pode exe­cu­tar janelas no estilo de widgets)

Você pode fazer down­load de cada um destes scripts sep­a­rada­mente no site developer.yahoo.com.

Cada uma das bib­liote­cas do Yahoo! depen­dem somente do arquivo yahoo.js. Por outro lado, esta aprox­i­mação ofer­ece uma exper­iên­cia ligeira­mente mais menos coer­ente para o desen­volve­dor e pode­ria pos­sivel­mente intro­duzir uma deter­mi­nada quan­ti­dade de repetição den­tro das bibliotecas.

Uma coisa inefi­caz sobre o YUI é o fato de que usa muito espaço inútil de strings. Cada chamada que você faz à bib­lioteca neces­sita ser pre­fix­ada com uma string do pacote:

var myAnim = new YAHOO.util.Anim(
 'test',
 { height: {to: 10} },
 1,
 YAHOO.util.Easing.easeOut
);
myAnim.animate();

O básico sobre YUI

A bib­lioteca de trata­mento de even­tos do YUI tem uma API muito famil­iar daque­las que são usadas nati­va­mente no browser. Entre­tanto, tem algu­mas sur­pre­sas agradáveis que o desen­volve­dor do Yahoo!, Dustin Diaz, expli­cou em detal­hes neste site. Você pode adi­cionar um sim­ples “ouvinte” como este:

YAHOO.util.event.addListener('object_id', 'click', callBackFunction);

Uma car­ac­terís­tica muito poderosa da bib­lioteca de even­tos é seu chamado ouvintes de evento. Essen­cial­mente, se você ten­tar unir um “ouvinte” a um ele­mento que não exista porque a página não car­regou ainda, esper­ará essa página para tornar-se disponível antes de unir ao evento. Esta é uma solução que talvez con­funda e frus­tre muitos novatos de DHTML.

A bib­lioteca de DOM resume as incon­sistên­cias do browser, per­mitindo o ajuste de esti­los das pro­priedades do ele­mento. Entre­tanto, enquanto toma cuidado das tare­fas comuns, exis­tem algu­mas sur­pre­sas aqui:

  • get é ver­são da função $ no YUI.
  • Um método inter­es­sante é o gen­er­ateId, que pode ser usado gerar IDs para ele­men­tos para que você possa rap­i­da­mente acessá-los em out­ros pon­tos do script.

O Geren­ci­ador de Conexão con­tem toda a mág­ica do AJAX no YUI, e seguindo a linha das out­ras bib­liote­cas, escolhe não fazer exame de uma aprox­i­mação alto-nível. Não faz nada mais do que fornecer uma relação cross browser ao XML­HttpRe­quest:

YAHOO.util.Connect.asyncRequest(
 'GET',
 'http://www.yahoo.com',
 callback
);

Um destaque é a rica inter­face call­back, que per­mite que você defina um objeto que envolva suas funções call­back com alguma con­fig­u­ração extra. Veja um exem­plo de objeto call­back:

var callback = {
 success: function(resp) { alert('WOO!!'); }, // called on success
 failure: function(resp) { alert('BOO!'); }, // called on error
 argument: arguments, // user defined arguments
 scope: formController // scope the callbacks are called within
}

Prós e contras

A doc­u­men­tação fornecida pelo Yahoo! para a bib­lioteca é exce­lente. O site tem a doc­u­men­tação for­mal da API, vários exem­p­los, uma lista de dis­cussão e algu­mas expli­cações breves das car­ac­terís­ti­cas prin­ci­pais de cada parte da bib­lioteca. O mel­hor lugar para ver­i­ficar para ver se há arti­gos sobre YUI é no site de Dustin Diaz, desen­volve­dor do Yahoo!.

Como eu citei acima, a imple­men­tação do con­t­role de even­tos é um dos atra­tivos do YUI. Entre­tanto, o restante da bib­lioteca, ao ser muito fun­cional, não con­tem tan­tas car­ac­terís­ti­cas ino­vado­ras como no Mochikit, Dojo e Pro­to­type, e por causa dos lon­gos nomes de pacotes, desen­volver com o YUI se torna, às vezes, uma tarefa longa.

Con­tudo a lista cres­cente dos com­po­nentes é muito rica. Por exem­plo, o com­po­nente de cal­endário (Cal­en­dar) suporta diver­sas lín­guas e múlti­plas seleções da data, e as classes do Con­tainer dão-lhe o poder de imple­men­tar todos os tipos inter­face com janelas. Um ponto ruim de usar estes com­po­nentes é que ten­dem a ser muito depen­dente de out­ras bib­liote­cas; neste dis­curso, Dean Edwards destaca como exem­plo o con­t­role do tree­view, que se usa em torno de 260 Kb do Javascript.

Con­clusão: Qual a melhor?

Bem, uma resposta curta a esta per­gunta é que não há nen­huma solução pronta que preen­cha todas as situações.

A bib­lioteca Pro­to­type é a que pos­sui uma doc­u­men­tação mais detal­hada. É tam­bém a bib­lioteca mais difun­dida neste momento. Nat­u­ral­mente, cam­inha para ser a escolha nat­ural dos desen­volve­dores Ruby porque abstrai várias car­ac­terís­ti­cas do Ruby on Rails. Outra coisa impor­tante sobre o Pro­to­type é que tem um peso dos Rails por trás e, em con­se­qüên­cia, há muitos desen­volve­dores que fornecem reparos e remen­dos do erro ao Pro­to­type. Final­mente, ofer­ece uma riqueza de bib­liote­cas adi­cionais tais como scrip­tac­u­lous, Rico, e Behav­iour que o faz uma boa e sól­ida escolha para muitos desenvolvedores.

Por outro lado, o Pro­to­type tem um frame­work de trata­mento de even­tos em-desenvolvimento, que é o prob­lema prin­ci­pal para uma bib­lioteca tão poderosa. Tam­bém – e esta é exclu­si­va­mente uma questão de gosto – a aprox­i­mação prag­mática do Pro­to­type às coisas (como o uso exces­sivo da pro­priedade do inner­HTML) pode pare­cer um pouco “suja” às vezes.

Para pro­je­tos menores, a forma que foi pro­je­tada e seus com­po­nentes, fazem do YUI um grande atra­tivo. É muito fácil de excluir um Geren­ci­ador de Conexão ou a bib­lioteca de Even­tos e começar fazendo algu­mas tare­fas bási­cas sem ter que atrav­es­sar uma curva de apren­diza­gem demasi­ada. No geral, con­tudo, não tem muito a ofer­e­cer nos ter­mos de car­ac­terís­ti­cas poderosas.

O Dojo é defin­i­ti­va­mente destaque deste grupo. E o foco do Dojo no desem­penho é um fator abso­luto se você estiver plane­ando uma apli­cação com uso inten­sivo de Javascript. A imple­men­tação de wid­get tem tam­bém um poten­cial enorme para a con­strução de com­plexos UIs. Entre­tanto é real­mente grande – ambos nos ter­mos de tamanho de arquivo e do tamanho da API – assim eu não o recomen­daria para pro­je­tos menores.

Na minha opinião, o Mochikit é muito bem pro­je­tado e o mel­hor dos qua­tro, e desen­volve­dores do Python/Twisted/Nevow acharão sua API muito famil­iar. Entre­tanto, sua doc­u­men­tação é escassa em alguns lugares (por exem­plo, eu ainda tenho dúvida a respeito de qual ver­são do Mochikit inserir no script). Tam­bém, algu­mas das téc­ni­cas fun­cionais que usa podem ser con­fusas para os novatos ou aque­les que não tem tanta prática em em téc­ni­cas de pro­gra­mação. Entre­tanto, vale a pena dar olha olhada. As fun­cional­i­dades do Mochikit provavel­mente sur­preen­derão você – a função cre­ate­DOM, as fer­ra­men­tas da iter­ação e a arquite­tura assín­crona são um tra­balho de arte.
Fonte:ciro­feitosa

Bad Behavior has blocked 25 access attempts in the last 7 days.