如何使用JavaScript / jQuery找到两个元素节点之间的所有文本节点?

时间:2010-12-09 13:07:31

标签: javascript jquery traversal

给出以下HTML片段:

<div>
  <p>
    abc <span id="x">[</span> def <br /> ghi
  </p>
  <p>
    <strong> jkl <span id="y">]</span> mno </strong>
  </p>
</div>

我需要一种算法来使用Javascript在#x#y之间获取Text类型的所有节点。或者是否有一个JQuery函数正是这样做的?

上面示例生成的Text节点(忽略空白节点)将是:

['def', 'ghi', 'jkl']

2 个答案:

答案 0 :(得分:7)

以下适用于使用DOM方法且没有库的所有主流浏览器。它还忽略了问题中提到的空白文本节点。

强制性的jsfiddle:http://jsfiddle.net/timdown/a2Fm6/

function getTextNodesBetween(rootNode, startNode, endNode) {
    var pastStartNode = false, reachedEndNode = false, textNodes = [];

    function getTextNodes(node) {
        if (node == startNode) {
            pastStartNode = true;
        } else if (node == endNode) {
            reachedEndNode = true;
        } else if (node.nodeType == 3) {
            if (pastStartNode && !reachedEndNode && !/^\s*$/.test(node.nodeValue)) {
                textNodes.push(node);
            }
        } else {
            for (var i = 0, len = node.childNodes.length; !reachedEndNode && i < len; ++i) {
                getTextNodes(node.childNodes[i]);
            }
        }
    }

    getTextNodes(rootNode);
    return textNodes;
}

var x = document.getElementById("x"),
    y = document.getElementById("y");

var textNodes = getTextNodesBetween(document.body, x, y);
console.log(textNodes);

答案 1 :(得分:0)

以下示例使用jQuery查找彼此相邻的任何两个元素,它们之间可能有也可能没有文本节点。这个foreach循环将检查结果元素以查找任何文本节点并将它们添加到列表中。

function getTextNodes() {
    var list = [];
    $(document.body).find("*+*").toArray().forEach(function (el) {
        var prev = el.previousSibling;
        while (prev != null && prev.nodeType == 3) {
            list.push(prev);
            prev = prev.previousSibling;
        }
    });
    return list;
}