【发布时间】:2011-02-01 16:30:27
【问题描述】:
我当前的项目涉及根据提供的选择器从一个元素及其所有后代中收集文本内容。
例如,当提供选择器 #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 的选择器逻辑是可用的。
提前感谢您的帮助!
【问题讨论】:
标签: javascript string dom text textnode