【问题标题】:Simple web script runs endlessly instead of only once简单的 web 脚本无休止地运行,而不是只运行一次
【发布时间】:2021-03-27 19:36:00
【问题描述】:

我正在编写一个 Tampermonkey 脚本来更改网页上某些内容的名称。但是,该脚本似乎无休止地运行。如果脚本在相应的网站(https://www.gutenberg.org/files/46/46-h/46-h.htm)上运行,它将把“Scrooge”变成“Happy Scrooge”变成“Happy Happy Scrooge”等等,而不是仅仅将“Scrooge”变成“Happy 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();
})();

【问题讨论】:

    标签: javascript html google-chrome-extension tampermonkey


    【解决方案1】:

    为了确保Happy Scrooge 不会被Happy Happy Scrooge 替换,我会改用正则表达式:匹配(?&lt;!Happy )Scrooge 并替换为Happy Scrooge,这样已更改的部分就不会再次更改,/(?&lt;!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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2022-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多