5

我从 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 in )。

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

为什么是这样?如何在我的 startContainer 之前获取所有同级节点,包括带有 jQ​​uery 的文本节点?

4

2 回答 2

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);
                            }
                        });
于 2010-10-19T13:38:01.907 回答
4

一般来说,jQuery 是关于操作 DOM 的元素忽略文本节点,特别是在“DOM 导航”函数系列中,它会竭尽全力(大多数情况下,该.text()函数是一个明显的例外) 。

是一个较旧的 Stackoverflow 问题,它可能会帮助您整理一些代码来查找文本节点。正如您在那个问题中看到的,jQuery.contents()函数确实包含文本节点。因此,你可以做一些事情,比如去你的文本节点的父节点并以这种方式获取它的内容,然后你可以从那组子节点中“找到自己”并确定直接邻居等。

于 2010-10-19T13:18:44.663 回答