Mặc dù không đẹp như querySelectorAll
(có nhiều vấn đề), đây là một chức năng rất linh hoạt, đệ quy DOM và sẽ hoạt động trong hầu hết các trình duyệt (cũ và mới). Miễn là trình duyệt hỗ trợ điều kiện của bạn (ví dụ: thuộc tính dữ liệu), bạn sẽ có thể truy xuất phần tử.
Đối với người tò mò: Đừng bận tâm kiểm tra điều này so với QSA trên jsPerf. Các trình duyệt như Opera 11 sẽ lưu trữ truy vấn và làm lệch kết quả.
Mã số:
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;
}
}
}
Sau đó, bạn có thể bắt đầu nó với những điều sau đây:
recurseDOM(document.body, {"1": 1});
cho tốc độ, hoặc chỉ recurseDOM(document.body);
Ví dụ với đặc điểm kỹ thuật của bạn: http://jsbin.com/unajot/1/edit
Ví dụ với thông số kỹ thuật khác nhau: http://jsbin.com/unajot/2/edit
document.querySelectorAll
không hoạt động trên IE7. Bạn sẽ phải tạo một tập lệnh dự phòng sẽ đi theo cây DOM và kiểm tra thuộc tính trong mỗi thẻ (thực sự tôi không biết tốc độ củaquerySelectorAll
nó là bao nhiêu và sẽ đi kiểm tra thẻ thủ công).