【发布时间】:2015-05-24 08:53:57
【问题描述】:
如何选择浏览器文档中所有可见的可渲染 HTML 文本节点?
换句话说,我如何获取可以通过脚本遍历的 DOM 节点列表,以便按文档顺序获取用户在浏览器中实际可见的文本?
我想依靠浏览器告诉我构成当前可见的可渲染文本的节点。我不知道从哪里开始。帮忙?
【问题讨论】:
标签: javascript html dom browser cross-browser
如何选择浏览器文档中所有可见的可渲染 HTML 文本节点?
换句话说,我如何获取可以通过脚本遍历的 DOM 节点列表,以便按文档顺序获取用户在浏览器中实际可见的文本?
我想依靠浏览器告诉我构成当前可见的可渲染文本的节点。我不知道从哪里开始。帮忙?
【问题讨论】:
标签: javascript html dom browser cross-browser
这很棘手,但这是我想出的:
function traverse(o) {
var a = [];
[].forEach.call(o.childNodes, function(val) {
if(val.nodeType===3) {
if(val.nodeValue.trim()>'') a.push(val);
}
else {
var style= getComputedStyle(val);
if(val.tagName!=='NOSCRIPT' &&
style.getPropertyValue('display')!=='none' &&
style.getPropertyValue('visibility')!=='hidden' &&
style.getPropertyValue('opacity')!=='0' &&
style.getPropertyValue('color')!==style.getPropertyValue('background-color')
) {
a= a.concat(traverse(val));
}
}
});
return a;
} //traverse
var textNodes= traverse(document.body);
这不检查文本节点是否隐藏在其他元素后面或者它们是否绝对定位在屏幕外。
【讨论】:
textNodes 数组的第 0 个元素有文本 '<div id="noscript-padding">',它来自 @987654326 @ 元素。那可能不应该在那里......
你应该可以在 1 行 JavaScript 中做到这一点:
document.querySelector("body").innerText
【讨论】:
innerText。