【问题标题】:Is there a way to only replace the innerText of all elements on a page?有没有办法只替换页面上所有元素的 innerText ?
【发布时间】:2015-04-13 19:30:48
【问题描述】:

背景

基于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)并粘贴上面的代码(如果需要,重新添加javascript:),这将对文档的内容执行正则表达式替换,同时保留大多数格式,创造一些有趣的阅读.

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

我不能简单地替换innerText,因为所有元素都包含他们自己的孩子的innerText;对 body 元素执行此操作会删除所有格式,并且对每个元素执行此操作会复制大量内容。

问题

有没有办法通过(最少的)javascript 遍历 HTML 文档中的所有节点,替换其直接子文本值中的单词,同时保留其剩余内容?

【问题讨论】:

  • 我承认这只是为了好玩;不是一个严肃的工作问题 - 但它很有趣,是学习/改进我的 javascript 的好机会。提前感谢您的任何想法。
  • 是的,有办法。你想要做的只是遍历text nodes

标签: javascript html innerhtml innertext


【解决方案1】:

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

页面发生变化的原因是脚本的值是字符串的值,所以它被用作新页面的内容。由于这只是一个没有定义所有样式和脚本的 head 标签的 HTML sn-p,因此您会得到一个仅包含内容的无样式页面。

如果要更改页面,则应将字符串作为内容放回正文中,然后使用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);

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 2022-01-13
    • 2022-07-06
    • 2021-04-03
    • 2011-08-01
    • 2020-02-01
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多