Хотя это и не так красиво, как 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
document.querySelectorAll
не работает на IE7. Вам нужно будет создать запасной скрипт, который будет обходить дерево DOM и проверять атрибут в каждом теге (на самом деле я понятия не имею, насколько быстро этоquerySelectorAll
делается, и я бы пошел на ручную проверку тегов).