有没有办法只替换页面上所有元素的innerText

Is there a way to only replace the innerText of all elements on a page?

本文关键字:元素 innerText 替换 换页 有没有      更新时间:2023-10-16

背景

基于今天的XKCD,我创建了以下脚本:

javascript:var a=document.getElementsByTagName('body')[0].innerHTML;a=a.replace(/Program('w'w+)*/gmi,'curse').replace(/language/gmi,'word');

如果你去一个网站(例如。http://en.wikipedia.org/wiki/Programming_language)并粘贴上面的代码(如果需要,重新添加javascript:),这将对文档的内容执行regex替换,同时保留大多数格式,创造一些有趣的阅读。

然而,网站的外观受到了影响;大概是因为我要替换innerHTML而不仅仅是innerText(我想,虽然不确定)。

我不能简单地替换innerText,因为所有元素都包含其子元素的innerText;在body元素上执行此操作将删除所有格式,在每个元素上执行该操作将复制大量内容。

问题

有没有一种方法可以通过(最小)javascript迭代HTML文档中的所有节点,替换其直接子文本值中的单词,同时保留其剩余内容?

您拥有的Javascript根本不会更改页面。它将正文的内容读取为字符串,然后更改字符串。这不会影响内容。

页面更改的原因是脚本的值就是字符串的值,因此它被用作新页面的内容。由于这只是一个没有head标记的HTML片段,所有的样式和脚本都是在这里定义的,所以您会得到一个只有内容的无样式页面。

如果您想更改页面,您应该将字符串作为内容放回正文中,然后使用void(0);作为最后一条语句来阻止创建新页面:

javascript:var a=document.getElementsByTagName('body')[0].innerHTML;a=a.replace(/Program('w'w+)*/gmi,'curse').replace(/language/gmi,'word');document.getElementsByTagName('body')[0].innerHTML=a;void(0);