Violentmonkey用户脚本@exclude规则无法针对特定URL生效导致无限循环问题
解决维基百科用户脚本的无限循环问题
嘿,我帮你定位到了脚本无限循环的问题所在,主要是两个小疏漏导致的:一是@exclude规则的写法在Violentmonkey里没正确生效,二是脚本代码本身没有主动检查URL是否已经包含useskin=vector参数,完全依赖排除规则,一旦规则失效就会触发循环。
问题拆解
- 你写的
@exclude /useskin=vector/正则匹配不够精确,Violentmonkey的匹配逻辑里,这种模糊的正则可能无法正确捕获带该参数的各种URL场景(比如参数在查询串中间、末尾,或者和哈希共存的情况)。 - 脚本设置了
@run-at document-start,页面刚加载就执行跳转,但如果新URL没被@exclude拦截,脚本会再次执行,再次添加参数,陷入死循环。
修复后的完整代码
我重新调整了脚本,从根源上避免循环,同时优化了URL处理逻辑:
// ==UserScript== // @name Wikipedia Vector // @namespace Violentmonkey Scripts // @match *://*.wikipedia.org/* // @exclude *://*.wikipedia.org/ // @exclude *://*.wikipedia.org/*?*useskin=vector* // @exclude *://*.wikipedia.org/*#*useskin=vector* // @grant none // @version 1.1 // @author - // @run-at document-start // ==/UserScript== (function() { 'use strict'; // 先检查是否已经设置了vector皮肤参数,有就直接退出 const urlParams = new URLSearchParams(window.location.search); if (urlParams.has('useskin') && urlParams.get('useskin') === 'vector') { return; } // 简化URL拼接逻辑,利用原生属性更可靠 const baseUrl = window.location.pathname + window.location.search; const hash = window.location.hash; const newUrl = baseUrl + (window.location.search ? '&' : '?') + 'useskin=vector' + hash; window.location.replace(newUrl); })();
关键改动说明
- 主动检查参数:用
URLSearchParams这个原生API来读取查询参数,直接判断是否已经设置了useskin=vector,如果是就立刻退出脚本,从根源上杜绝循环。 - 优化@exclude规则:改成更精确的通配符匹配,覆盖所有包含
useskin=vector参数的URL场景,作为双重保险。 - 简化URL拼接:不再手动截取字符串索引,而是用
window.location的pathname、search、hash属性来拼接,避免手动处理索引时可能出现的错误。
这样修改后,不管是Firefox还是其他浏览器的Violentmonkey,都不会再出现无限循环的问题啦。
内容的提问来源于stack exchange,提问作者combperm
相关产品推荐
相关产品推荐

