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 để đệ trình DOM và 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ử.
Để 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 lại truy vấn và nghiêng kết quả.
Code:
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 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 khác nhau đặc điểm kỹ thuật: http://jsbin.com/unajot/2/edit
Nguồn
2011-08-16 22:24:38
Hãy nhớ rằng 'document.querySelectorAll' không hoạt động trên IE7. Bạn sẽ phải tạo một kịch bản dự phòng mà sẽ * đi bộ * cây DOM và kiểm tra thuộc tính trong mỗi thẻ (thực ra tôi không biết tốc độ 'querySelectorAll' là bao nhiêu và sẽ kiểm tra thủ công các thẻ). –
Lý do bạn không sử dụng jQuery là gì? Nó là khá nhiều không thể thay thế trong các tình huống như thế này ... –
@ không phải ở tất cả các bạn thậm chí có thể chọn các yếu tố này trong css tinh khiết quá. – Knu