Oldukça hoş olmasa da querySelectorAll(bir sorun litani vardır), DOM'u geri alan ve çoğu tarayıcıda (eski ve yeni) çalışması gereken çok esnek bir işlev. Tarayıcı durumunuzu desteklediği sürece (yani: veri özellikleri), öğeyi alabilmeniz gerekir.
Meraklı için: Bunu jsPerf'de QSA'ya karşı test etmekten çekinmeyin. Opera 11 gibi tarayıcılar sorguyu önbelleğe alır ve sonuçları eğriltir.
Kod:
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;
}
}
}
Daha sonra aşağıdakilerle başlatabilirsiniz:
recurseDOM(document.body, {"1": 1}); hız için, ya da sadece recurseDOM(document.body);
Spesifikasyonunuza göre örnek: http://jsbin.com/unajot/1/edit
Farklı özelliklere sahip örnek: http://jsbin.com/unajot/2/edit
document.querySelectorAllIE7 üzerinde çalışmadığını unutmayın . DOM ağacında yürüyecek ve her etikette özniteliği kontrol edecek bir yedek komut dosyası oluşturmak zorunda kalacaksınız (aslında ne kadar hızlıquerySelectorAllolduğu hakkında hiçbir fikrim yok ve etiketlerin manuel kontrolü için gidecekti).