如何检测哪个用户脚本管理器正在运行脚本

时间:2017-09-08 17:39:55

标签: javascript greasemonkey userscripts

由于Greasemonkey的限制,我正在使用我正在编写的用户脚本中的函数,这在Greasemonkey中不起作用。此功能对于用户脚本的正确操作不是必需的,但它可以改善用户体验,因此我不想完全删除它。

我尝试使用try { ... } catch() { ... }块,但不幸的是,Greasemonkey在尝试执行该函数时停止执行该脚本,而不是抛出异常。所以我决定在通过Greasemonkey加载脚本时阻止执行该函数,但我一直无法找到这样做的方法。

如何检测活动用户脚本管理器是否为Greasemonkey?

2 个答案:

答案 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发出功能请求,以支持scriptHandler属性。 (Tampermonkey和ViolentMonkey已经这样做了。) 有a recently closed pull request for this for Greasemonkey,所以可能它将出现在下一个版本中吗?