我从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的文本节点?
答案 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()
函数 包含文本节点。因此,您可以执行某些操作,例如前往文本节点的父节点并以此方式获取其内容,然后从该组子节点中您可以“找到自己”并确定直接邻居等。