Skip to content

Instantly share code, notes, and snippets.

@garlicnation
Last active December 20, 2016 21:25
Show Gist options
  • Save garlicnation/d9b93bd66f3d22e46e3483bf23a9d01c to your computer and use it in GitHub Desktop.
Save garlicnation/d9b93bd66f3d22e46e3483bf23a9d01c to your computer and use it in GitHub Desktop.
Two different deep queries
/**
* Find all elements inside `root` that match `selector`, even inside shadow roots.
*/
function qsAllDomTreeWalker(root, selector, results){
if (!results) {
results = []
}
var queue = [];
const newWalker = (root) => document.createTreeWalker(
root,
NodeFilter.SHOW_ELEMENT
);
var walker = newWalker(root);
var candidate = walker.nextNode();
while (candidate) {
if (candidate.matches && candidate.matches(selector)) {
results.push(walker.currentNode);
}
if (candidate.shadowRoot) {
queue.push(candidate.shadowRoot);
}
candidate = walker.nextNode();
while (!candidate && queue.length > 0) {
walker = newWalker(queue.pop());
candidate = walker.nextNode();
}
}
return results;
}
/**
* Find all elements inside `root` that match `selector`, even inside shadow roots.
* This method is significantly faster than qsAllDom
*/
function qsAllDomElementsByTag(root, selector, results){
if (!results) {
results = []
}
var newResults = root.querySelectorAll(selector);
for (var result of newResults) {
results.push(result);
}
var queue = [];
var roots = root.getElementsByTagName('*');
for (var i = 0; i < roots.length; i++) {
var shadow = roots[i].shadowRoot;
if (!shadow) {
continue;
}
for (var j = 0; j < shadow.children.length; j++) {
queue.push(shadow.children[j]);
}
if (i === roots.length - 1 && queue.length > 0) {
roots = queue.pop().getElementsByTagName('*');
}
}
return results;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment