Embora não seja tão bonita quanto querySelectorAll
(que tem uma série de problemas), aqui está uma função muito flexível que repete o DOM e deve funcionar na maioria dos navegadores (antigos e novos). Enquanto o navegador suportar sua condição (por exemplo: atributos de dados), você poderá recuperar o elemento.
Para os curiosos: não se preocupe em testar isso vs. QSA no jsPerf. Navegadores como o Opera 11 armazenam em cache a consulta e inclinam os resultados.
Código:
function recurseDOM(start, whitelist)
{
/*
* @start: Node - Specifies point of entry for recursion
* @whitelist: Object - Specifies permitted nodeTypes to collect
*/
var i = 0,
startIsNode = !!start && !!start.nodeType,
startHasChildNodes = !!start.childNodes && !!start.childNodes.length,
nodes, node, nodeHasChildNodes;
if(startIsNode && startHasChildNodes)
{
nodes = start.childNodes;
for(i;i<nodes.length;i++)
{
node = nodes[i];
nodeHasChildNodes = !!node.childNodes && !!node.childNodes.length;
if(!whitelist || whitelist[node.nodeType])
{
//condition here
if(!!node.dataset && !!node.dataset.foo)
{
//handle results here
}
if(nodeHasChildNodes)
{
recurseDOM(node, whitelist);
}
}
node = null;
nodeHasChildNodes = null;
}
}
}
Você pode iniciá-lo com o seguinte:
recurseDOM(document.body, {"1": 1});
por velocidade, ou apenas recurseDOM(document.body);
Exemplo com sua especificação: http://jsbin.com/unajot/1/edit
Exemplo com especificação diferente: http://jsbin.com/unajot/2/edit
document.querySelectorAll
não funciona no IE7. Você teria que criar um script de fallback que percorresse a árvore DOM e verificasse o atributo em cada tag (na verdade, eu não tenho ideia de quão rápidoquerySelectorAll
é, e iria para a verificação manual de tags).