May 21 2008

Percorrendo Javascript Objects como uma árvore binária

Tag: Javascriptdavid @ 2:41 pm

Estive dando uma revisada no meu material antigo nos últimos dias e acabei revendo uma série de vídeos do Doug Crockford (pela décima ou décima primeira vez, não me recordo precisamente, ainda estão no YUI! Theater e vocês deveriam assistir todos eles também, mais de uma vez) e em um dos trechos acabei me deparando com a já bem comentada função walkTheDom, usada para percorrer recursivamente um nó ou toda a árvore do DOM utilizando os recursos de reflection do Javascript de uma forma ou de outra.

function walkTheDOM(node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
        walkTheDOM(node, func);
        node = node.nextSibling;
    }
}

Uma série de estruturas no browser se encaixam nesse paradigma, os próprios objetos Javascript são estruturas de dados que podem ser percorridas exatamente da mesma forma, e do mesmo jeito que o mestre Crockford percorre o DOM você pode pode percorrer um Objeto interrogando todos os seus elementos filhos a procura de quem interessa, um método de um objeto, um valor, um objeto específico. A coisa pode ficar realmente complexa se levarmos em consideração que um objeto js é uma cadeia de elementos sem um final definido, podemos ter um objeto que contenha um array de objetos que contenha um outro array de objetos e assim por diante. Para um exemplo prático dê uma olhada no objeto YAHOO utilizado como namespace na YUI! (e que na prática é um objeto js como qualquer outro):

Um exemplo inocente:

var walkThatObject = function(object, func){
    for(var prop in object){
        func(object[prop]);
        if(typeof object[prop]== ‘object’){
            walkThatObject(object[prop], func);
        }
    }
}

//Poderia ser uma literal de objeto aqui
var thatObject = {};

thatObject.Nome = ‘David’;
thatObject.Sobrenome = ‘Duarte’;
thatObject.Qualidades = {qualidade1:’Geek’, qualidade2:’Javascripter’, qualidade3:{subqualidade:’Bom filho’}};

walkThatObject(thatObject, function(obj){
    if(typeof obj == ’string’){
        alert(obj);
    }
});

Interessante e “extremamente relevante” não? Pense nisso…


May 20 2008

Cross-Site XMLHttpRequest? Não no Firefox 3

Tag: Javascriptdavid @ 8:30 pm

Veio o RC1 e entre muitas melhorias (o tão falado gerenciamento de memória, e algumas novidades em relação ao Javascript por exemplo) uma decepção ficou aparente, pelo menos a meu ver já ficou claro que podemos perder as esperanças de ver XHR Cross-Domain na versão final do Firefox 3, ou pelo menos as esperanças de ver isso funcionando nas páginas web.

O nada discreto aviso continua na página de documentação da Mozilla dizendo “This feature is available in Firefox 3, but only to extensions and other privileged code; it is not currently available for web content” então pela primeira vez em meses acho que posso dizer que o time do IE saiu na frente em alguma coisa.

Enquanto o pessoal da Mozilla não conseguiu resolver a sua implementação o time do IE simplificou e criou um objeto a parte só para esse fim, o XDomainRequest , particularmente achei inteligente separar as coisas, uma vez que permite que algumas validações sejam incorporadas a implementação nativa ( item 2 do working draft da W3C cita: ” Must not require content authors or site maintainers to implement new or additional security protections to preserve their existing level of security protection.”).

Puxa, bastante tempo sem reclamar de nada, postarei com mais frequência :-P