Хоча не так симпатично, як 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
, і пішов би на ручну перевірку тегів).