javascript - 如何仅获取文本节点的渲染文本?

标签 javascript firefox-addon-webextensions

我正在创建一个小网络扩展,它根据文本修改网页。作为我的问题的一个例子,这里是一些代码,其中树遍历器抓取页面上的所有文本节点:

var treeWalker = document.createTreeWalker(
  document.body,
  NodeFilter.SHOW_TEXT,
  { acceptNode: () => {return NodeFilter.FILTER_ACCEPT;} },
  false
);

while(treeWalker.nextNode()) {
  let x = treeWalker.currentNode.data;
  //do something with x
}

不幸的是,x 将拥有节点中的所有文本,即使它没有显示在网页上。

我想要的是类似treeWalker.currentNode.innerText的东西,但是对于文本节点来说这是未定义的。有谁知道如何仅获取文本节点向用户显示的文本?

示例:如果网页具有包含以下 HTML 的节点:

<div>
  <script type="text/x-config">
    {
      "setObject": -1
    }
  </script>
    <span>Quiz</span>

与关联的 CSS:

script {
    display: none;
}

然后,相应文本节点的文本内容(减去额外的空格和换行符)将作为“{ "setObject": -1 } Quiz”返回。然而,呈现给用户的唯一内容是“测验”。给定相应的文本节点,如何仅获取渲染的文本?

最佳答案

我想我们有问题。

如果您使用新的浏览器,您应该能够使用innerText,但如果不是,则必须使用textContent。 textContent 的问题是它获取所有元素的内容,包括 and ,并且 textContent 不知道样式,因此它将返回隐藏事件。

我想正确的方法是将过滤器替换为 NodeFilter.SHOW_ELEMENT 并获取 Element.innerHTML

所以尝试一下:

var treeWalker = document.createTreeWalker(
    document.body,
    NodeFilter.SHOW_ELEMENT,
    { acceptNode: (node) => {  return NodeFilter.FILTER_ACCEPT;} },
false
);

while(treeWalker.nextNode()) {
    let x = treeWalker.currentNode.innerHTML;
    //do something with x
}

关于javascript - 如何仅获取文本节点的渲染文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46460451/

相关文章:

javascript - 火狐网络扩展 : selectionText in contextMenus only returns 150 characters

javascript - 将 'null' 返回到我的服务器

javascript - 在我的名字空间javascript中存储变量

javascript - ng-repeat 与 AngularJs 中嵌套的 json 对象数组

javascript - 一种限制 JavaScript/CSS 范围的方法?

javascript - 用于复制图像的 Firefox WebExtension 替代插件剪贴板 sdk

firefox - 在启动时使用临时加载项打开 Firefox

javascript - Firefox WebExtensions API 如何对当前选项卡网站进行 AJAX 调用

javascript - Bootstrap 模态元素偏移量为零

javascript - Firefox/Chrome Web 扩展 - 尝试通过内容脚本注入(inject) IFrame 时出现安全错误