How to get nodes lying inside a range with javascript?
Here's an implementation I came up with to solve this:
function getNextNode(node){ if (node.firstChild) return node.firstChild; while (node) { if (node.nextSibling) return node.nextSibling; node = node.parentNode; }}function getNodesInRange(range){ var start = range.startContainer; var end = range.endContainer; var commonAncestor = range.commonAncestorContainer; var nodes = []; var node; // walk parent nodes from start to common ancestor for (node = start.parentNode; node; node = node.parentNode) { nodes.push(node); if (node == commonAncestor) break; } nodes.reverse(); // walk children and siblings from start until end is found for (node = start; node; node = getNextNode(node)) { nodes.push(node); if (node == end) break; } return nodes;}
The getNextNode will skip your desired endNode recursively if its a parent node.
Perform the conditional break check inside of the getNextNode instead:
var getNextNode = function(node, skipChildren, endNode){ //if there are child nodes and we didn't come from a child node if (endNode == node) { return null; } if (node.firstChild && !skipChildren) { return node.firstChild; } if (!node.parentNode){ return null; } return node.nextSibling || getNextNode(node.parentNode, true, endNode); };
and in while statement:
while (startNode = getNextNode(startNode, false , endNode));