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.querySelectorAll
IE7 ü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ıquerySelectorAll
olduğu hakkında hiçbir fikrim yok ve etiketlerin manuel kontrolü için gidecekti).