ないきれいなほどの間にquerySelectorAll
(問題の連祷を持っている)、ここではDOMを再帰と(新旧)ほとんどのブラウザで動作するはずです非常に柔軟な機能があります。ブラウザが条件(つまり、データ属性)をサポートしている限り、要素を取得できます。
奇妙なことに:jsPerfでこれとQSAをテストする必要はありません。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
し、タグの手動チェックのために行くだろうが)。