我正在写一个the猴子脚本来更改网页上的东西的名称。然而,脚本似乎会无休止地运行。如果脚本在相应的网站(https://www.gutenberg.org/files/46/46-h/46-h.htm)上运行,它将把"Scrooge“变成"Happy Scrooge”变成"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();
})();发布于 2020-12-17 13:36:14
为了确保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存在于原始的超文本标记语言中的任何地方,所以看起来不需要后视:
p.innerHTML = p.innerHTML.replaceAll('Scrooge', 'Happy Scrooge');https://stackoverflow.com/questions/65335167
复制相似问题