Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use jQuery prevAll() to select nearby text nodes?

I'm getting a text node (node.nodeType == 3) returned from the getSelection range, eg.:

var selectionRange = selection.getRangeAt(0);
var startContainer = selectionRange.startContainer;

This startContainer usually is a text node, eg the following html:

<p>Paragraph in <u>parag</u>raph.</p>

Would result in the text node with text "raph." if | denotes the selection:

<p>Paragraph in <u>parag</u>r|aph|.</p>

That's right, the selected text is aph and the text node is raph., because before raph there is a new text node inside the u node.

Now, when calling $(startContainer).prevAll().each(function(index, node) ... I expected this to return U (which contains a text node with parag) and another text node (which contains Paragraph in ).

However, it returns only U and not the text node to the left of it.

Why is this? How do I get all same-level nodes before my startContainer, including text nodes with jQuery?

like image 680
Tom Avatar asked Oct 19 '10 12:10

Tom


1 Answers

Thanks to Pointy, who's answer I accepted, I came up with the following:

var left = true;
                        var leftNodes = [];
                        var rightNodes = [];
                        $(startContainer).parent().contents().each(function(index, node) {
                            if (!left) { //right
                                rightNodes.push(node);
                            }
                            else if ((node.isSameNode(startContainer)) && (left)) {
                                left = false;
                            }
                            else { //left
                                leftNodes.push(node);
                            }
                        });
like image 139
Tom Avatar answered Oct 18 '22 10:10

Tom