如何使用jQuery prevAll()来选择附近的文本节点?

时间:2010-10-19 12:53:51

标签: javascript jquery html selection siblings

我从getSelection范围返回一个文本节点(node.nodeType == 3),例如:

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

这个startContainer通常是一个文本节点,例如以下html:

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

会导致文本节点包含文本“raph”。如果|表示选择:

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

没错,所选文本是aph,文本节点是raph。,因为在raph之前u节点内有一个新的文本节点。

现在,在致电$(startContainer).prevAll().each(function(index, node) ...时 我希望这会返回U(包含带有parag的文本节点)和另一个文本节点(包含Paragraph)。

但是,它只返回U而不返回左侧的文本节点。

这是为什么?如何在startContainer之前获取所有相同级别的节点,包括带有jQuery的文本节点?

2 个答案:

答案 0 :(得分:6)

感谢Pointy,我接受了他的答案,我想出了以下内容:

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);
                            }
                        });

答案 1 :(得分:4)

一般来说,jQuery是关于操纵DOM的元素忽略文本节点,特别是在“DOM导航”功能系列中,它一直不受约束(大部分时间,.text()函数是一个明显的例外)。

Here是一个较旧的Stackoverflow问题,可能有助于您将一些代码放在一起以查找文本节点。正如您在该问题中看到的,jQuery .contents()函数 包含文本节点。因此,您可以执行某些操作,例如前往文本节点的父节点并以此方式获取其内容,然后从该组子节点中您可以“找到自己”并确定直接邻居等。