Meskipun tidak secantik querySelectorAll
(yang memiliki banyak masalah), inilah fungsi yang sangat fleksibel yang mengulang DOM dan harus bekerja di sebagian besar browser (lama dan baru). Selama browser mendukung kondisi Anda (yaitu: atribut data), Anda harus dapat mengambil elemen tersebut.
Untuk yang penasaran: Jangan repot-repot menguji ini vs QSA di jsPerf. Browser seperti Opera 11 akan men-cache permintaan dan cenderung hasilnya.
Kode:
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;
}
}
}
Anda kemudian dapat memulai dengan yang berikut:
recurseDOM(document.body, {"1": 1});
untuk kecepatan, atau adil recurseDOM(document.body);
Contoh dengan spesifikasi Anda: http://jsbin.com/unajot/1/edit
Contoh dengan spesifikasi berbeda: http://jsbin.com/unajot/2/edit
document.querySelectorAll
itu tidak berfungsi pada IE7. Anda harus membuat skrip fallback yang akan berjalan di pohon DOM dan memeriksa atribut di setiap tag (sebenarnya saya tidak tahu seberapa cepatquerySelectorAll
, dan akan pergi untuk memeriksa tag secara manual).