แม้ว่าจะไม่สวยเท่า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
และจะไปตรวจสอบแท็กด้วยตนเอง)