getElementsByTagName()
has 2 great features: it is fast and it is live. But what if I want to get p strong
. Of course I could refine a selection using
Consider using mutation observers. Watch for childList
with subtree: true
. When the notification arrives, you can examine each added node with matches
to see if it matches some selector.
function querySelectorAllLive(element, selector) {
// Initialize results with current nodes.
var result = Array.prototype.slice.call(element.querySelectorAll(selector));
// Create observer instance.
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
[].forEach.call(mutation.addedNodes, function(node) {
if (node.nodeType === Node.ELEMENT_NODE && node.matches(selector)) {
result.push(node);
}
});
});
});
// Set up observer.
observer.observe(element, { childList: true, subtree: true });
return result;
}