Хотя это и не так красиво, как querySelectorAll
(с множеством проблем), есть очень гибкая функция, которая повторяет DOM и должна работать в большинстве браузеров (старых и новых).Пока браузер поддерживает ваше условие (т. Е. Атрибуты данных), вы сможете извлекать элемент.
Для любопытных: не пытайтесь протестировать это против QSA на jsPerf.Браузеры, такие как Opera 11, будут кешировать запрос и искажать результаты.
Код:
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;
}
}
}
Затем вы можете запустить его следующим образом:
recurseDOM(document.body, {"1": 1});
для скоростиили просто recurseDOM(document.body);
Пример с вашей спецификацией: http://jsbin.com/unajot/1/edit
Пример с другой спецификацией: http://jsbin.com/unajot/2/edit