代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  4
  • Tom  · 技术社区  · 15 年前

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

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

    此startContainer通常是文本节点,例如以下html:

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

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

    也就是说,选定的文本是aph,文本节点是raph,因为在raph之前,u节点内有一个新的文本节点。

    $(startContainer).prevAll().each(function(index, node) ... 我希望它返回U(其中包含一个带有parag的文本节点)和另一个文本节点(其中包含in的段落)。

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

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    通常,jQuery是关于操作 在大教堂里。它会走它的路(大多数时候 .text() 忽视 文本节点,尤其是在“DOM导航”函数族中。

    Here 是一个旧的Stackoverflow问题,它可以帮助您组合一些代码来查找文本节点。正如您在那个问题中看到的,jQuery .contents() 功能 包括文本节点。因此,您可以做一些事情,比如转到文本节点的父节点并以这种方式获取它的内容,然后从这组子节点中您可以“找到自己”并确定近邻,等等。

        2
  •  6
  •   Tom    15 年前

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