Aunque no es tan bonita como querySelectorAll
(que tiene una larga lista de temas), he aquí una función muy flexible que recursivamente el DOM y debería funcionar en la mayoría de los navegadores (antiguos y nuevos). Siempre que el navegador admita su condición (es decir, atributos de datos), debe poder recuperar el elemento.
Para curiosos: No se moleste en probar esto en comparación con QSA en jsPerf. Los navegadores como Opera 11 almacenarán en caché la consulta y sesgarán los 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;
}
}
}
A continuación, puede iniciar con la siguiente:
recurseDOM(document.body, {"1": 1});
para la velocidad, o simplemente recurseDOM(document.body);
Ejemplo con sus especificaciones: http://jsbin.com/unajot/1/edit
Ejemplo con diferentes especificación: http://jsbin.com/unajot/2/edit
Tenga en cuenta que 'document.querySelectorAll' no funciona en IE7. Tendría que crear un script alternativo que * recorra * el árbol DOM y verificando el atributo en cada etiqueta (en realidad no tengo idea de qué tan rápido es 'querySelectorAll', e iría para la verificación manual de las etiquetas). –
¿Cuál es el motivo por el que no utilizas jQuery? Es bastante irremplazable en situaciones como esta ... –
@hay, en absoluto, puedes incluso seleccionar estos elementos en css puros también. – Knu