简单的 web 脚本无休止地运行而不是只运行一次

Simple web script runs endlessly instead of only once

我正在编写一个 Tampermonkey 脚本来更改网页上某些内容的名称。但是,脚本好像运行没完没了。如果脚本在相应的网站上是运行(https://www.gutenberg.org/files/46/46-h/46-h.htm),它会将“Scrooge”变成“Happy Scrooge”变成“Happy Happy Scrooge”等,而不仅仅是“Scrooge”变成“快乐守财奴。

最终,页面 运行 内存不足并导致选项卡崩溃。即使没有什么可以重新替换的,比如只是“悲伤”变成“快乐”,它仍然会在一分钟内让标签崩溃。这对我来说似乎很简单,但我还没有在网上找到解决方案。如果有任何帮助,我将不胜感激!

我是网络编程的新手,所以如果有人对清理我的代码有任何建议,我将不胜感激。

// ==UserScript==
// @name         Change Name
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Changes the name of something on a webpage.
// @author       You
// @match        https://www.gutenberg.org/files/46/46-h/46-h.htm
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    function run () {
        var ele = document.querySelectorAll("p");
        var i, str, n;
        var oldName = "Scrooge";
        var newName = "Happy Scrooge";
        for (i = 0; i < ele.length; i++) {
            str = ele[i].innerHTML;
            n = str.indexOf(oldName);
            if (n > -1) {
                str = str.replace(oldName, newName);
                ele[i].innerHTML = str;
            } else {
                setTimeout(run, 500);
            }
        }
    }

    run();
})();

为了确保 Happy Scrooge 不会被 Happy Happy Scrooge 替换,我会改用正则表达式:匹配 (?<!Happy )Scrooge 并用 Happy Scrooge 替换,这样/(?<!Happy )Scrooge/g.

已更改的部分不会再次更改

但是递归超时没有意义 - 只需替换所有内容一次:

// ==UserScript==
// @name         Change Name
// @match        https://www.gutenberg.org/files/46/46-h/46-h.htm
// @grant        none
// ==/UserScript==

for (const p of document.querySelectorAll("p")) {
  p.innerHTML = p.innerHTML.replace(/(?<!Happy )Scrooge/g, 'Happy Scrooge');
}

不过,在那个时候,由于看起来 Happy Scrooge 不存在于原始 HTML 中的任何地方,因此看起来不需要回顾:

p.innerHTML = p.innerHTML.replaceAll('Scrooge', 'Happy Scrooge');