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

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

背景

基于 today's 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)并粘贴上面的代码(re-adding javascript: 如果需要),这会对文档内容执行正则表达式替换,同时保留大部分格式,创造一些有趣的阅读。

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

我不能简单地替换 innerText,因为所有元素都包含它们自己的 child 的 innerText;在 body 元素上这样做会删除所有格式,而在每个元素上这样做会重复大量内容。

问题

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

您拥有的 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);