给出以下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']
答案 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;
}