我当前的项目涉及根据提供的选择器从元素及其所有后代中收集文本内容。
例如,当提供选择器#content
并针对此 HTML 运行时:
<div id="content">
<p>This is some text.</p>
<script type="text/javascript">
var test = true;
</script>
<p>This is some more text.</p>
</div>
我的脚本会返回(经过一点空白清理):
这是一些文字。变种测试=真;这是更多的文本。
但是,我需要忽略<script>
元素中出现的文本节点。
这是我当前代码的摘录(从技术上讲,它基于一个或多个提供的选择器进行匹配):
// get text content of all matching elements
for (x = 0; x < selectors.length; x++) { // 'selectors' is an array of CSS selectors from which to gather text content
matches = Sizzle(selectors[x], document);
for (y = 0; y < matches.length; y++) {
match = matches[y];
if (match.innerText) { // IE
content += match.innerText + ' ';
} else if (match.textContent) { // other browsers
content += match.textContent + ' ';
}
}
}
这有点过于简单,因为它只返回与提供的选择器匹配的元素(及其后代)中的所有文本节点。<script>
我正在寻找的解决方案将返回所有文本节点,但属于元素的节点除外。它不需要特别高性能,但我确实需要它最终是跨浏览器兼容的。
我假设我需要以某种方式遍历与选择器匹配的元素的所有子元素,并累积除<script>
元素内的所有文本节点之外的所有文本节点;一旦它已经滚动到从所有文本节点累积的字符串中,它看起来就没有任何方法可以识别 JavaScript。
我不能使用 jQuery(出于性能/带宽原因),尽管您可能已经注意到我确实使用了它的 Sizzle 选择器引擎,所以 jQuery 的选择器逻辑是可用的。
提前感谢您的帮助!