由于Greasemonkey的限制,我正在使用我正在编写的用户脚本中的函数,这在Greasemonkey中不起作用。此功能对于用户脚本的正确操作不是必需的,但它可以改善用户体验,因此我不想完全删除它。
我尝试使用try { ... } catch() { ... }
块,但不幸的是,Greasemonkey在尝试执行该函数时停止执行该脚本,而不是抛出异常。所以我决定在通过Greasemonkey加载脚本时阻止执行该函数,但我一直无法找到这样做的方法。
如何检测活动用户脚本管理器是否为Greasemonkey?
答案 0 :(得分:1)
与列表中的第三项相同,您可以选择Greasemonkey不支持的功能,但支持您的功能的userscript管理器支持该功能。
从this comparison table我们可以看到Greasemonkey不支持@author元属性,但是Tampermonkey和Violentmonkey支持它。这意味着如果您设置@author元属性,则可以通过GM_info.script.author
检查是否存在。
// ==UserScript==
// @name Greasemonkey Check
// @description Checks if the script is loaded by Greasemonkey or not
// @author @TinyGiant
// @grant none
// ==/UserScript==
const isGM = 'undefined' === typeof GM_info.script.author;
console.log(`Is Greasemonkey? ${isGM}`);
答案 1 :(得分:1)
检查正在运行的管理器是一种糟糕的方法,这将被证明是脆弱和高维护。 聪明的做法是检查这个神秘的功能是否存在,或根据需要运作。
这是与#34;浏览器嗅探相同类型的问题"答案是一样的:Use feature detection instead.
EG:
if (typeof dicyFunc == "function") {
//-- Use the function
dicyFunc ();
}
else {
console.error ("This userscript engine does not support dicyFunc.");
}
用户评论更新: 有时你可能也需要一个try ... catch块。 EG:
try {
REALLY_dicyFunc ();
}
catch (zError) {
console.error ("REALLY_dicyFunc fail on this engine: ", zError);
}
你需要给出一个具体的例子(Make a MCVE)。
如果您坚持引擎检测,请参阅this answer一个近似重复的问题。
基本上,您将使用GM_info.scriptHandler
属性,可能由GM_info.version
属性备份。
为获得最佳效果,为Greasemonkey发出功能请求,以支持。 (Tampermonkey和ViolentMonkey已经这样做了。)
有a recently closed pull request for this for Greasemonkey,所以可能它将出现在下一个版本中吗?scriptHandler
属性