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

Tom*_*Tom 4 html javascript jquery selection siblings

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

var selectionRange = selection.getRangeAt(0);
var startContainer = selectionRange.startContainer;
Run Code Online (Sandbox Code Playgroud)

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

<p>Paragraph in <u>parag</u>raph.</p>
Run Code Online (Sandbox Code Playgroud)

将导致文本节点的文本为"raph".如果| 表示选择:

<p>Paragraph in <u>parag</u>r|aph|.</p>
Run Code Online (Sandbox Code Playgroud)

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

现在,在调用时$(startContainer).prevAll().each(function(index, node) ... 我希望它返回U(包含带有parag的文本节点)和另一个文本节点(包含Paragraph in).

但是,它仅返回U而不返回其左侧的文本节点.

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

Tom*_*Tom 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);
                            }
                        });
Run Code Online (Sandbox Code Playgroud)


Poi*_*nty 4

一般来说,jQuery 是关于操作DOM元素的。它不遗余力地忽略文本节点(大多数时候,该.text()函数是一个明显的例外),尤其是在“DOM 导航”函数系列中。

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