如何在不破坏现有HTML的情况下更改DOM中的所有文本?

op

我想用javascript替换页面上的特定文本。对于simplicty可以说,我想要替换所有字母一个字母X重要的是它不会破坏内联HTML。

有没有一种简单的方法可以迭代所有DOM元素并仅更改实际文本?

<span>hello world <a href="/">abcd</a>..</span>

应该成为

<span>hello world <a href="/">xbcd</a>..</span>

并不是

<spxn>hello world <x href="/">xbcd</x>..</spxn>
一定的表现

遍历所有文本节点nodeValue如果它们包含,则更改它们a

function getAllTextNodes() {
    var walker = document.createTreeWalker(
        document.body, 
        NodeFilter.SHOW_TEXT, 
        null, 
        false
    );

    var node;
    var textNodes = [];

    while(node = walker.nextNode()) {
        textNodes.push(node);
    }
    return textNodes;
}

getAllTextNodes().forEach((node) => {
  const { nodeValue } = node;
  const newValue = nodeValue.replace(/a/g, 'x');
  if (newValue !== nodeValue) {
    node.nodeValue = newValue;
  }
});
<a href="/">abcd</a>

如果需要,您还可以创建其文本节点可更改的父母白名单或黑名单:

function getAllTextNodes() {
    var walker = document.createTreeWalker(
        document.body, 
        NodeFilter.SHOW_TEXT, 
        null, 
        false
    );

    var node;
    var textNodes = [];

    while(node = walker.nextNode()) {
        textNodes.push(node);
    }
    return textNodes;
}

const tagNamesToKeepUnchanged = ['SCRIPT'];

getAllTextNodes().forEach((node) => {
  if (tagNamesToKeepUnchanged.includes(node.parentNode.tagName)) {
    return;
  }
  const { nodeValue } = node;
  const newValue = nodeValue.replace(/a/g, 'x');
  if (newValue !== nodeValue) {
    node.nodeValue = newValue;
  }
});

const obj = JSON.parse(
  document.querySelector('script[type="application/json"]').textContent
);
console.log(obj.key);
<a href="/">abcd</a>
<p>foo bar</p>
<script type="application/json">{"key":"value"}</script>

这将保留标记名,事件侦听器以及几乎所有其他内容,但某些文本节点的内容除外。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不破坏现有设置的情况下更改akka-scala响应模型

表格分区 - 如何在不破坏所有内容的情况下添加列?

如何在不破坏树的情况下从BST弹出所有项目?

如何在不接触未更改文件的情况下替换Perl中现有文件中的字符串

如何在不更改下面一行的样式的情况下查找和替换MS Word 2013中具有样式的所有文本

如何在不更改.NET Desktop App中现有加密代码的情况下使用WinRT进行解密?

如何在不更改新列表的情况下从现有列表创建列表?

如何在不破坏现有客户端的情况下扩展terraform模块输入变量模式?

如何在不违反约束的情况下增加主键列中的现有值?

如何在不覆盖FireBase RealTimeDB中现有对象的情况下导入Json数组

如何在不覆盖 Go 中现有文件的情况下复制文件?

如何在不更改全局打印选项的情况下显示数据框的所有列?

如何在不获取所有 html 的情况下获取 QTextEdit 的 html 标签?

如何在不更改/删除其他工作表的情况下添加/覆盖现有 xlsx 文件的工作表

如何在不延迟所有其他功能的情况下延迟 Pygame 中的事件?

如何在不循环的情况下访问对象数组中的所有键和值

如何在不破坏SOLID的情况下从具有不同类型的表中获取记录

jQuery:如何在不使用“更改”,“键”之类的交互的情况下使用现有输入文本值

如何在不破坏原有代码的情况下增加函数的返回值?

如何在不丢失现有路径的情况下从有向图中删除顶点?

如何在不更改列的所有元素的情况下更改 2D ArrayList 的元素

如果更改,如何在不更改链接属性的情况下强制所有iframe内容显示在顶部?

gmail和Facebook如何在不更改整个HTML DOM的情况下更改URL路径?

如何在不破坏现有客户端代码的情况下将类转换为模板类(c++17 之前)?

如何在不指定每个文本框的情况下将相同功能应用于控制器中的所有文本框

在不更改旧值的情况下更新pyspark中的现有列

如何在不丢失数据的情况下使用现有列在表中添加外键?

如何在不循环的情况下使用现有数组值中的动态键映射新数组?

如何在不访问源代码的情况下从现有 Java 应用程序中检索实时数据?